如果我想让部署后脚本只运行一次脚本,有没有办法做到这一点?
我只想为我的数据库运行一次部署后脚本
最佳答案
使用一次性脚本时,可以使用 Script.PostDeployment.sql
和 Script.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/