Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 部署后脚本_Sql Server_Continuous Integration_Sql Server Data Tools - Fatal编程技术网

Sql server 部署后脚本

Sql server 部署后脚本,sql-server,continuous-integration,sql-server-data-tools,Sql Server,Continuous Integration,Sql Server Data Tools,我希望在部署后忽略部署后脚本。在SSDT的生产环境中部署分支特定的部署后脚本后,如何存档/删除该脚本?有什么最佳实践吗 我以前做的是创建日志表并存储所有执行的脚本。这是表结构: 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

我希望在部署后忽略部署后脚本。在SSDT的生产环境中部署分支特定的部署后脚本后,如何存档/删除该脚本?有什么最佳实践吗

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

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
然后,我们创建了以下脚本文件夹结构:

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\u data\u insert.sql
是您需要的脚本,应该只在环境中执行一次,
pre\postscript\u all\u一起执行。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.sql
Script.PreDeployment1.sql
文件中,您将拥有:

:r.\one\u time\u scripts\postscript\u all\u一起。sql


:r.\one\u time\u scripts\prescript\u all\u一起。sql

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

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
然后,我们创建了以下脚本文件夹结构:

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\u data\u insert.sql
是您需要的脚本,应该只在环境中执行一次,
pre\postscript\u all\u一起执行。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.sql
Script.PreDeployment1.sql
文件中,您将拥有:

:r.\one\u time\u scripts\postscript\u all\u一起。sql


:r.\one_time_scripts\prescript_all_.sql

那么-如果我想拥有一系列“运行一次”类型的脚本,我会为它们创建包装器,比如这样的?在我们不想重复数据迁移的情况下,可以考虑更多。无论是否需要再次运行,它是否仍会将所有代码都放入部署后脚本中?我不确定是否完全理解您的意思。您需要为每个只想执行一次的脚本创建这样的包装器。执行后,它将文件名存储在数据库日志表中。下次将跳过此脚本,因为表中将有条目。所有这些包装器都将添加到最终脚本中。我们有调用数据库的powershell脚本,根据日志表,从脚本中删除此包装。这使得在部署之前查看脚本变得更容易。所以-如果我想有一系列“运行一次”类型的脚本,我会为它们创建包装器,比如这样的?在我们不想重复数据迁移的情况下,可以考虑更多。无论是否需要再次运行,它是否仍会将所有代码都放入部署后脚本中?我不确定是否完全理解您的意思。您需要为每个只想执行一次的脚本创建这样的包装器。执行后,它将文件名存储在数据库日志表中。下次将跳过此脚本,因为表中将有条目。所有这些包装器都将添加到最终脚本中。我们有调用数据库的powershell脚本,根据日志表,从脚本中删除此包装。这样可以更容易地在部署之前查看脚本。