SSDT部署后脚本

时间:2019-08-12 11:28:00

标签: sql-server continuous-integration sql-server-data-tools

在部署后,我想忽略它。将分支特定的后期部署脚本部署到SSDT的生产环境中后,如何归档/删除该分支?周围是否有最佳做法?

1 个答案:

答案 0 :(得分:2)

我过去要做的是创建日志表并存储所有执行的脚本。这是表结构:

CREATE TABLE dbo.publish_script_logs
(
    script_name_id VARCHAR(255) NOT NULL
  , database_name  VARCHAR(255) NOT NULL
  , execution_time DATETIME2(7) NOT NULL
);

然后我们创建了以下脚本文件夹结构:

one_time_scripts
  initial_data_insert.sql
  ...
  postscript_all_together.sql
  prescript_all_together.sql
  ...
Script.PostDeployment1.sql
Script.PreDeployment1.sql

其中initial_data_insert.sql是您所需的脚本,应该只在环境中执行一次,而pre\postscript_all_together.sql是将所有这些脚本收集在一起的脚本。必须为所有这些脚本设置 Build = None 有限制-“一次性脚本”中不允许使用GO语句分隔符。

现在这是这两个脚本在单个脚本中的内容:

:SETVAR ScriptNameId ".\initial_data_insert"
GO
IF NOT EXISTS ( SELECT  *
                FROM    [dbo].[publish_script_logs]
                WHERE   [Script_Name_Id] = '$(ScriptNameId)' 
                AND [database_name] = DB_NAME()
                )
BEGIN
BEGIN TRY
    :r $(ScriptNameId)".SQL"
    INSERT  INTO [dbo].[publish_script_logs]
    VALUES  ( '$(ScriptNameId)', DB_NAME() ,GETDATE() );
END TRY
BEGIN CATCH
    DECLARE @err VARCHAR(MAX) = ERROR_MESSAGE();
    DECLARE @msg VARCHAR(MAX) = 'One time script $(ScriptNameId).sql failed ' + @err;
    RAISERROR (@msg, 16, 1);
END CATCH
END;
GO

最后在Script.PostDeployment1.sqlScript.PreDeployment1.sql文件中,您将拥有:

:r .\one_time_scripts\postscript_all_together.sql

:r .\one_time_scripts\prescript_all_together.sql