SSDT Post Deployment Scripts

后端 未结 1 486
深忆病人
深忆病人 2021-01-26 00:52

I would like to ignore post deployment scripts after it has been deployed. How do you archive/remove a branch specific post deployment script after it has been deployed on produ

1条回答
  •  遥遥无期
    2021-01-26 01:24

    What I used to do is to create log table and store all the executed scripts. This is the table structure:

    CREATE TABLE dbo.publish_script_logs
    (
        script_name_id VARCHAR(255) NOT NULL
      , database_name  VARCHAR(255) NOT NULL
      , execution_time DATETIME2(7) NOT NULL
    );
    

    Then we created following scripts folder structure:

    one_time_scripts
      initial_data_insert.sql
      ...
      postscript_all_together.sql
      prescript_all_together.sql
      ...
    Script.PostDeployment1.sql
    Script.PreDeployment1.sql
    

    where initial_data_insert.sql is your needed script that is supposed to be executed on environment just once and pre\postscript_all_together.sql are the scripts where all these scripts are collected together. Build = None must be set for all of these scripts. There is limitation - GO statement separator is not allowed in "one time scripts".

    Now this is what will these 2 scripts will have inside for single script:

    :SETVAR ScriptNameId ".\initial_data_insert"
    GO
    IF NOT EXISTS ( SELECT  *
                    FROM    [dbo].[publish_script_logs]
                    WHERE   [Script_Name_Id] = '$(ScriptNameId)' 
                    AND [database_name] = DB_NAME()
                    )
    BEGIN
    BEGIN TRY
        :r $(ScriptNameId)".SQL"
        INSERT  INTO [dbo].[publish_script_logs]
        VALUES  ( '$(ScriptNameId)', DB_NAME() ,GETDATE() );
    END TRY
    BEGIN CATCH
        DECLARE @err VARCHAR(MAX) = ERROR_MESSAGE();
        DECLARE @msg VARCHAR(MAX) = 'One time script $(ScriptNameId).sql failed ' + @err;
        RAISERROR (@msg, 16, 1);
    END CATCH
    END;
    GO
    

    And finally in the Script.PostDeployment1.sql and Script.PreDeployment1.sql files you'll have:

    :r .\one_time_scripts\postscript_all_together.sql

    and

    :r .\one_time_scripts\prescript_all_together.sql

    0 讨论(0)
提交回复
热议问题