如果我想让部署后脚本运行一个脚本只有一次有办法吗?
我只想为我的数据库运行一次部署后脚本
答案 0 :(得分:2)
我发现的最佳方法是确保您的脚本可以重新运行或幂等(对于长时间的啰嗦)。
所以,如果你想做一些像插入行的事情,检查它是否存在。
如果要设置参考数据或静态数据表,请使用合并语句。
如果要重建索引,请使用sys.stats检查上次重建的日期。
编
答案 1 :(得分:2)
我所做的是我创建了两个主要脚本文件:Script.PostDeployment.sql和Script.PreDeployment.sql,其中列出了应该执行的所有文件。每个文件 - 我需要执行一次的脚本。对于我正在编写以下代码段的每个文件:
:SETVAR ScriptNameId "\PostScripts\PathToScript\ScriptNameHere"
GO
IF NOT EXISTS ( SELECT *
FROM dbo.ScriptsHistoryTableWithVeryNiceName
WHERE [ScriptNameId] = '$(ScriptNameId)' )
BEGIN
:r "."$(ScriptNameId)".SQL"
INSERT INTO dbo.ScriptsHistoryTableWithVeryNiceName
VALUES ( '$(ScriptNameId)', GETDATE() );
END;
GO
当我添加新脚本时,我只需更改脚本顶部的名称即可。
表格结构dbo.ScriptsHistoryTableWithVeryNiceName
非常明显,所以我没有看到将它留在这里的重点。
更新:
忘了提。有时我想只在特定环境下运行一些脚本。然后我在脚本中创建了以下部分:
:SETVAR ScriptNameId "\PostScripts\QAOnly\VeryImportantScript"
GO -- you need to have this go here
IF NOT EXISTS ( SELECT *
FROM dbo.ScriptsHistoryTableWithVeryNiceName
WHERE [ScriptNameId] = '$(ScriptNameId)' )
AND '$(DeployType)' = 'QA'
BEGIN
:r "."$(ScriptNameId)".SQL"
INSERT INTO dbo.ScriptsHistoryTableWithVeryNiceName
VALUES ( '$(ScriptNameId)', GETDATE() );
END;
GO
IF ( '$(DeployType)' = 'Prod' )
BEGIN
EXEC [Maintenance].[CleanUpSchema] 'tSQLt', 'w';
END;
IF ( '$(DeployType)' = 'Dev' )
BEGIN
PRINT ( 'Nothing to do for Dev' );
END;
答案 2 :(得分:1)
唯一的方法是在条件语句中使用SQLCMD变量。假设设置SQLCMD变量" IsTheFirstDeployment"到" 1"在Project属性中,您可以在部署后脚本中使用类似的内容:
IF '$(IsTheFirstDeployment)' = '1'
BEGIN
...your code...
END