彩票走势图

将自定义部署脚本与SQL Compare或SQL Change Automation一起使用(下)

翻译|使用教程|编辑:莫成敏|2019-11-07 11:56:23.060|阅读 381 次

概述:本文描述了自定义部署前和部署后脚本的工作方式,使用SQL Compare或SQL Change Automation进行基于状态的数据库部署时,以及如何使用它们(例如,向目标数据库添加版本号)来指定其数据库设置,或将数据填充到某些表中。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

SQL Compare是一款比较和同步SQL Server数据库结构的工具。现有超过150,000的数据库管理员、开发人员和测试人员在使用它。当测试本地数据库,暂存或激活远程服务器的数据库时,SQL Compare将分配数据库的过程自动化。

点击下载SQL Compare免费版

将自定义部署脚本与SQL Compare或SQL Change Automation一起使用

本文描述了自定义部署前和部署后脚本的工作方式,使用SQL Compare或SQL Change Automation进行基于状态的数据库部署时,以及如何使用它们(例如,向目标数据库添加版本号)来指定其数据库设置,或将数据填充到某些表中。内容紧接“将自定义部署脚本与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 TRY
MERGE 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', 'Mnchen', 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_id
WHEN 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 try
BEGIN CATCH
    DECLARE @msg nvarchar(max)=Error_Message(), @severity int = ERROR_SEVERITY(),
            @State int = ERROR_State()
    RAISERROR(@msg, @severity, @state);
    SET NOEXEC ON
END 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 int
SELECT  @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.databases
WHERE name='pubs'
IF @AutoCreateStatistics=0
  ALTER DATABASE current
    SET AUTO_CREATE_STATISTICS ON   
DECLARE @AnyErrors INT =@@error
IF @AutoUpdateStatistics=0
  ALTER DATABASE current
    SET AUTO_UPDATE_STATISTICS ON
SELECT @AnyErrors=@AnyErrors+@@Error
IF @AutoUpdateStatisticsAsynchronously=1
  ALTER DATABASE current 
    SET AUTO_UPDATE_STATISTICS_ASYNC OFF
SELECT @AnyErrors=@AnyErrors+@@Error
if @ReadCommittedSnapshot=0
  ALTER DATABASE current
    SET READ_COMMITTED_SNAPSHOT ON WITH rollback immediate
SELECT @AnyErrors=@AnyErrors+@@Error
if @recovery_model_desc<>'SIMPLE'
  ALTER DATABASE CURRENT SET RECOVERY SIMPLE
SELECT @AnyErrors=@AnyErrors+@@Error
/* normally you'd want it at your current product version
but 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 //docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql?view=sql-server-ver15 before doing this
IF 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_AI
SELECT @AnyErrors=@AnyErrors+@@Error
IF @AnyErrors>0
    SET NOEXEC ON

添加版本信息

这可以作为部署前脚本或部署后脚本来完成。此示例脚本仅将版本号和说明作为JSON字符串插入。本文直接将数据与SQL Server数据库对象相关联,其中包含该代码的扩展版本,该版本可以跟踪版本以及何时应用版本。

PRINT N'Adding a version number'
GO
DECLARE @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 TRY
IF 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=@DatabaseInfo
ELSE
  EXEC sys.sp_Updateextendedproperty  @name=N'Database_Info', @value=@DatabaseInfo
END TRY
BEGIN CATCH
    DECLARE @msg nvarchar(max)=Error_Message(), @severity int = ERROR_SEVERITY(),
            @State int = ERROR_State()
    RAISERROR(@msg, @severity, @state);
    SET NOEXEC ON
END CATCH

结论

部署前或部署后脚本使我们能够克服开发团队所面临的大多数问题,这些开发团队正在通过SQL Compare在脚本目录中部署数据库代码,同时在版本控制中保留了源代码的唯一真实性。

本教程内容到这里就结束了,喜欢的朋友可以继续关注我们后续内容哦~您也可以下载SQL Compare试用版体验一下~

相关内容推荐:

SmartBear资源专题>>>

将自定义部署脚本与SQL Compare或SQL Change Automation一起使用(上)


想要购买SQL Compare正版授权,或了解更多产品信息请点击

850×682.png


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn

文章转载自:

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP