发布部署脚本只运行一次脚本一次

时间:2015-06-29 11:52:28

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

如果我想让部署后脚本运行一个脚本只有一次有办法吗?

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

3 个答案:

答案 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