SSDT 项目发布事务部署

Posted

技术标签:

【中文标题】SSDT 项目发布事务部署【英文标题】:SSDT Project publish transactional deployment 【发布时间】:2019-01-27 21:05:22 【问题描述】:

我正在使用 SQLPackage.exe 实用程序和数据库项目的发布配置文件来运行对 SQL Server 数据库的更改。

据我了解,这是部署过程:

预部署脚本


主要部署


部署后脚本


我在发布配置文件高级设置中选中了“包含事务脚本”选项,但是,这似乎仅适用于主部署部分。

我的问题是:如果主部署失败,是否提交了预部署脚本?此外,如果部署后脚本失败,是否正在提交部署前更改和主要部署更改?

是否可以使发布脚本“原子” - 一切作为一个单元成功或失败?

谢谢。

【问题讨论】:

好问题。我还没有找到一种方法来实现这一点。您可以将部署前脚本和部署后脚本放在自己的事务中,但它不会回滚它运行的所有 DDL。 部署前和部署后脚本在其余事务之外运行。你需要以某种方式推出自己的产品。理想情况下,在测试环境中运行并确保没有外部更改可能是确保一切顺利运行的最佳选择。 【参考方案1】:

您应该简单地在 pre 脚本中打开事务并在 post 脚本中提交它。当您设置此设置时,它与 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

【讨论】:

谢谢,是的,这正是我正在寻找的东西。

以上是关于SSDT 项目发布事务部署的主要内容,如果未能解决你的问题,请参考以下文章

简化 SSDT 数据库项目到 localdb 的部署

使用 SSDT 进行自定义表比较和部署

部署 SQL SSDT 项目时如何跟踪数据更改

部署后脚本中的执行过程-SSDT

创建发布预览时出现 SSDT 发布错误

SSDT 在没有任何更改时删除并重新创建表