c# - 发布部署脚本以仅运行一次脚本

标签 c# mysql visual-studio-2012 sql-server-data-tools

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

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

最佳答案

使用一次性脚本时,可以使用 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 语句,因为这会导致外部脚本过早终止。

关于c# - 发布部署脚本以仅运行一次脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31114990/

相关文章:

c# - VSTS - 在部署之前使应用程序离线

mysql - 搜索条件mysql IF(name=name,LIMIT 1,LIMIT 5)

c# - 将 UserControl 添加到 C# 中的变量位置

c# - 奇怪的 : C# Type or Namespace name could not be found - Builds successfully

c# - Entity Framework 映射 API 引用错误

C# 数组作为 MySQL Select 语句的一部分?

mysql - 通过附加复选框更新连接表 has_many

mysql按日期范围显示行和组中的每种类型

c# - Visual Studio 2012 中的 VS 常量

c# - 使用 C# 运行 T4 模板