SSDT Post 部署脚本
SSDT Post Deployment Scripts
我想在部署后忽略 post 部署脚本。在 SSDT 中部署到生产环境后,如何 archive/remove 分支特定 post 部署脚本?周围有什么最佳实践吗?
我以前做的是创建日志table并存储所有执行的脚本。这是 table 结构:
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 必须 为所有这些脚本设置。 存在限制 - "one time scripts".
中不允许使用 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.sql
和 Script.PreDeployment1.sql
文件中,您将拥有:
:r .\one_time_scripts\postscript_all_together.sql
和
:r .\one_time_scripts\prescript_all_together.sql
我想在部署后忽略 post 部署脚本。在 SSDT 中部署到生产环境后,如何 archive/remove 分支特定 post 部署脚本?周围有什么最佳实践吗?
我以前做的是创建日志table并存储所有执行的脚本。这是 table 结构:
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 必须 为所有这些脚本设置。 存在限制 - "one time scripts".
现在这两个脚本将包含在单个脚本中:
: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.sql
和 Script.PreDeployment1.sql
文件中,您将拥有:
:r .\one_time_scripts\postscript_all_together.sql
和
:r .\one_time_scripts\prescript_all_together.sql