SSDT项目发布事务性部署

3
我正在使用SQLPackage.exe工具和数据库项目的发布配置文件来运行对SQL Server数据库的更改。
据我所知,这是部署过程:
预部署脚本
主要部署
后部署脚本
在发布配置文件的高级设置中,我已选中“包括事务脚本”选项,但似乎只适用于主要部署部分。
我的问题是:如果主要部署失败,是否会提交预部署脚本?同样地,如果后部署脚本失败,是否会提交预部署更改和主要部署更改?
是否有可能将发布脚本设置为“原子性”,即所有内容作为单个单位成功或失败?
谢谢。

1
好问题。我还没有找到一种方法来实现这个。你可以将预部署脚本和后部署脚本放在它们自己的事务中,但它不会回滚它运行的所有DDL。 - sean
1
预部署和后部署脚本在其他事务之外运行。你需要以某种方式自己编写。理想情况下,在测试环境中运行并确保没有外部更改可能是确保一切顺利运行的最佳选择。 - Peter Schott
1个回答

4
您只需要在预设脚本中打开交易并在后置脚本中提交它。这段代码与SSDT生成的代码非常相似,当您设置此设置时会生成相似的代码。
预设脚本:
IF (SELECT OBJECT_ID('tempdb..#tmpErrors2')) IS NOT NULL DROP TABLE #tmpErrors2
GO
CREATE TABLE #tmpErrors2 (Error int)
GO
SET XACT_ABORT ON
GO
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
BEGIN TRANSACTION
GO



--Your prescript part goes here



GO
IF @@ERROR <> 0
   AND @@TRANCOUNT > 0
    BEGIN
        ROLLBACK;
    END

IF @@TRANCOUNT = 0
    BEGIN
        INSERT  INTO #tmpErrors2 (Error)
        VALUES                 (1);
        BEGIN TRANSACTION;
    END

后记:

GO
IF @@ERROR <> 0
   AND @@TRANCOUNT > 0
    BEGIN
        ROLLBACK;
    END

IF @@TRANCOUNT = 0
    BEGIN
        INSERT  INTO #tmpErrors2 (Error)
        VALUES                 (1);
        BEGIN TRANSACTION;
    END


GO

IF EXISTS (SELECT * FROM #tmpErrors2) ROLLBACK TRANSACTION
GO
IF @@TRANCOUNT>0 BEGIN
PRINT N'Post/Pre script finished'
COMMIT TRANSACTION
END
ELSE PRINT N'Pre/Post scripts failed'
GO
DROP TABLE #tmpErrors2
GO

谢谢,是的,那正是我在寻找的东西。 - Prany

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接