部署后脚本只运行一次脚本

Sum*_*ati 3 c# mysql visual-studio-2012 sql-server-data-tools

如果我想让部署后脚本只运行一次脚本,有没有办法做到这一点?

我只想为我的数据库运行一次部署后脚本

Dmi*_*sev 8

您可以创建 2 个主要脚本文件:Script.PostDeployment.sqlScript.PreDeployment.sql为您要执行的每个脚本放置以下语句(请注意,所有GO语句都在这里很重要)。

:SETVAR ScriptNameId ".\PostScripts\PathToScript\ScriptNameHere"
GO

IF NOT EXISTS (   SELECT *
                    FROM dbo.ScriptsHistoryTableWithVeryNiceName
                   WHERE Script_Name_Id = '$(ScriptNameId)' AND database_name = DB_NAME())
    BEGIN
        BEGIN TRY
            :r $(ScriptNameId)".SQL"
            INSERT INTO dbo.ScriptsHistoryTableWithVeryNiceName
            VALUES ('$(ScriptNameId)', DB_NAME(), SYSDATETIME());
        END TRY
        BEGIN CATCH
            DECLARE @err VARCHAR(MAX) = ERROR_MESSAGE();

            RAISERROR('One time script $(ScriptNameId).sql failed %s', 16, 1, @err);
        END CATCH;
    END;
GO
Run Code Online (Sandbox Code Playgroud)

和表 DDL

CREATE TABLE dbo.ScriptsHistoryTableWithVeryNiceName
(
    ScriptNameId  VARCHAR(255) NOT NULL
  , DatabaseName  sysname NOT NULL
  , ExecutionTime DATETIME2(7) NOT NULL
);
GO
Run Code Online (Sandbox Code Playgroud)

重要提示:您不能GO在这些一次性脚本文件中包含语句。


Ed *_*ott 5

我发现的最好方法是确保您的脚本可重新运行或幂等(对于长篇大论)。

所以,如果你想做一些事情,比如插入一行,首先检查它是否存在。

如果要设置参考数据或静态数据表,请使用合并语句。

如果要重建索引,请使用 sys.stats 检查上次重建的日期。

编辑