mysql 部署后脚本,仅运行脚本一次

6yjfywim  于 2023-02-18  发布在  Mysql
关注(0)|答案(3)|浏览(158)

如果我想让部署后脚本只运行一次脚本,有什么办法吗?
我只想为数据库运行一次部署后脚本

luaexgnf

luaexgnf1#

使用一次性脚本时,可以使用Script.PostDeployment.sqlScript.PreDeployment.sql文件分别在部署之前和之后执行脚本。要跟踪已执行的脚本,可以创建历史记录表来记录脚本名、数据库名和执行时间。
Script.PostDeployment.sql文件中,可以使用以下代码执行一次性脚本:

: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

在这段代码中,你可以通过设置ScriptNameId变量来指定一次性脚本的路径,如果这个脚本之前没有执行过,那么这个脚本文件将会被执行,并且它的详细信息会被添加到历史记录表中。
下面是创建dbo.ScriptsHistoryTableWithVeryNiceName表的代码:

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

重要提示:不能在一次性脚本文件本身中包含GO语句,因为这将导致外部脚本过早终止。

5kgi1eie

5kgi1eie2#

我发现的最好的方法是确保您的脚本是可重复运行的或幂等的(对于冗长的)。
因此,如果要执行插入行之类的操作,请先检查它是否存在。
如果要设置参考数据或静态数据表,请使用merge语句。
如果要重建索引,请使用sys.stats检查上次重建的日期。
艾德

snz8szmq

snz8szmq3#

唯一的方法是在条件语句中使用SQLCMD变量。假设在Project属性中将SQLCMD变量“IsTheFirstDeployment”设置为“1”,则可以在部署后脚本中使用类似于以下内容的内容:

IF '$(IsTheFirstDeployment)' = '1'
BEGIN

...your code...

END

相关问题