SQL Compare是一款比较和同步SQL Server数据库结构的工具。现有超过150,000的数据库管理员、开发人员和测试人员在使用它。当测试本地数据库,暂存或激活远程服务器的数据库时,SQL Compare将分配数据库的过程自动化。
SQL Compare免费版
将自定义部署脚本与SQL Compare或SQL Change Automation一起使用
源代码控制和自定义脚本
部署后和部署前脚本几乎都应该保留在源代码管理中。无论它们创建或更改什么对象,状态都必须处于源代码控制中。通常,对于表拆分之类的更改,只需添加一个SQL Compare过滤器或/exclude切换为告诉SQL Compare在比较中不包括受影响的对象,因为它是在随附的部署后脚本中完成的。这意味着源代码控制可以具有用于更改对象的SQL DDL代码,而它们的存在不会干扰复杂的数据拆分。如前所述,在允许同步脚本进行除对象以外的其余所有更改之前,完全有可能使用预部署脚本将要更改的表中的现有数据从目标表中保存到目标数据库中。您指定要排除在外;然后匹配的部署后脚本可以读取临时表并将数据放置在正确的位置。
不一定要保证数据库部署的目标。如果您不维护实时数据库的版本 ,则需要确保自定义脚本将与“疯狂”的所有可能目标版本一起使用。
例子
这些不应该按原样运行; 例如,您需要填写数据库的名称和版本 ,或者根据需要调整信息。 数据库设置示例可能会对运行它的不幸数据库产生微妙而广泛的影响。 它们也不代表如何执行这些任务的一般建议,因为您的情况可能会有所不同。例如,“存有数据的表”示例将很好,直到您有成千上万的行,此时您使用大容量插入效果更好。 这些示例仅是为了说明,以向您展示可能性
向表中存储数据
想象一下,您需要构建一个过时的PUBS数据库版本,包括所有数据。该脚本必须位于“部署后”目录中。这是确保dbo.publishers表仅包含原始数据的示例。
PRINT 'Ensuring that the original PUBS test data is there'BEGIN TRYMERGE INTO dbo.publishers AS target USING (VALUES ( '0736', 'New Moon Books', 'Boston', 'MA', 'USA' ), ( '0877', 'Binnet & Hardley', 'Washington', 'DC', 'USA' ), ( '1389', 'Algodata Infosystems', 'Berkeley', 'CA', 'USA' ), ( '1622', 'Five Lakes Publishing', 'Chicago', 'IL', 'USA' ), ( '1756', 'Ramona Publishers', 'Dallas', 'TX', 'USA' ), ( '9901', 'GGG&G', 'Mchen', NULL, 'Germany' ), ( '9952', 'Scootney Books', 'New York', 'NY', 'USA' ), ( '9999', 'Lucerne Publishing', 'Paris', NULL, 'France' ))source(pub_id,pub_name,city,[state],country) ON target.pub_id = source.pub_idWHEN NOT MATCHED BY TARGET THEN INSERT ( pub_id,pub_name,city,[state],country ) VALUES ( pub_id,pub_name,city,[state],country )WHEN NOT MATCHED BY SOURCE THEN DELETE;END tryBEGIN CATCH DECLARE @msg nvarchar(max)=Error_Message(), @severity int = ERROR_SEVERITY(), @State int = ERROR_State() RAISERROR(@msg, @severity, @state); SET NOEXEC ONEND CATCH
数据库设置
这些必须在部署前脚本中执行。为了使数据库按预期运行,需要某些数据库属性设置。通常最好在部署时检查这些设置,因为它们有时会产生细微的错误。排序规则、恢复模型和兼容性级别是显而易见的,但是还需要检查其他几项,例如自动更新统计信息和自动创建统计信息。当然,您需要确定数据库的正确设置。这些只是DBA可能建议的设置示例。
/* To run this Requires having ALTER permission on the target database. */PRINT 'Ensuring that the settings are right for this particular database.DECLARE @AutoCreateStatistics INT,@AutoUpdateStatistics INT, @ReadCommittedSnapshot INT,@AutoUpdateStatisticsAsynchronously INT,@recovery_model_desc nvarchar(120),@compatibility_level intSELECT @AutoCreateStatistics=is_auto_create_stats_on, @AutoUpdateStatistics=is_auto_update_stats_on, @AutoUpdateStatisticsAsynchronously=is_auto_update_stats_async_on, @ReadCommittedSnapshot=is_read_committed_snapshot_on, @recovery_model_desc=recovery_model_desc, @compatibility_level=[compatibility_level]FROM sys.databasesWHERE name='pubs'IF @AutoCreateStatistics=0 ALTER DATABASE current SET AUTO_CREATE_STATISTICS ON DECLARE @AnyErrors INT =@@errorIF @AutoUpdateStatistics=0 ALTER DATABASE current SET AUTO_UPDATE_STATISTICS ONSELECT @AnyErrors=@AnyErrors+@@ErrorIF @AutoUpdateStatisticsAsynchronously=1 ALTER DATABASE current SET AUTO_UPDATE_STATISTICS_ASYNC OFFSELECT @AnyErrors=@AnyErrors+@@Errorif @ReadCommittedSnapshot=0 ALTER DATABASE current SET READ_COMMITTED_SNAPSHOT ON WITH rollback immediateSELECT @AnyErrors=@AnyErrors+@@Errorif @recovery_model_desc<>'SIMPLE' ALTER DATABASE CURRENT SET RECOVERY SIMPLESELECT @AnyErrors=@AnyErrors+@@Error/* normally you'd want it at your current product versionbut you might, as in this case, need something different check product version with SELECT SERVERPROPERTY('ProductVersion');*/IF @compatibility_level<>100 --Warning this is specially for old PUBS! ALTER DATABASE PUBS --a bad idea anywhere else SET COMPATIBILITY_LEVEL = 100 SELECT @AnyErrors=@AnyErrors+@@Error--See https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sqliew=sql-server-ver15 before doing thisIF NOT EXISTS ( SELECT 1 FROM sys.databases WHERE name= Db_Name() AND collation_name='SQL_Latin1_General_CP1_CI_AI') ALTER DATABASE CURRENT COLLATE SQL_Latin1_General_CP1_CI_AISELECT @AnyErrors=@AnyErrors+@@ErrorIF @AnyErrors>0 SET NOEXEC ON
添加版本信息
PRINT N'Adding a version number'GODECLARE @DatabaseInfo NVARCHAR(3750)SELECT @DatabaseInfo = ( SELECT Db_Name() AS "Name", '2.4.01 (Change This to your version)' AS "Version", 'You will need to edit this string' AS "Description", GetDate() AS "Modified", SUser_Name() AS "by" FOR JSON PATH );BEGIN TRYIF not EXISTS (SELECT name, value FROM fn_listextendedproperty( N'Database_Info',default, default, default, default, default, default) ) EXEC sys.sp_addextendedproperty @name=N'Database_Info', @value=@DatabaseInfoELSE EXEC sys.sp_Updateextendedproperty @name=N'Database_Info', @value=@DatabaseInfoEND TRYBEGIN CATCH DECLARE @msg nvarchar(max)=Error_Message(), @severity int = ERROR_SEVERITY(), @State int = ERROR_State() RAISERROR(@msg, @severity, @state); SET NOEXEC ONEND CATCH
结论
部署前或部署后脚本使我们能够克服开发团队所面临的大多数问题,这些开发团队正在通过SQL Compare在脚本目录中部署数据库代码,同时在版本控制中保留了源代码的唯一真实性。
本教程内容到这里就结束了,喜欢的朋友可以继续关注我们后续内容哦~您也可以下载SQL Compare试用版体验一下~
相关内容推荐:
SmartBear资源专题>>>
将自定义部署脚本与SQL Compare或SQL Change Automation一起使用(上)
想要购买SQL Compare正版授权,或了解更多产品信息请点击“咨询在线客服”

标签:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!