使用带有SSDT的msbuild,我尝试过IncludeTransactionalScripts,但它似乎只将每个语句放在一个单独的事务中。 是否可以将多个数据库项目作为事务发布? 如果没有,我是否至少可以确保每个项目都在交易中发布?
答案 0 :(得分:5)
对于发现此问题的其他人,但不知道在哪里看:
有一个发布设置“包含事务脚本”,它在发布脚本的开头处开始一个事务。然后,它会在错误检查中包装脚本中的每个模式更改。出现错误时,将回滚事务并增加错误日志,但事务从头开始。如果没有错误,则事务继续未提交
BEGIN TRANSACTION
...alter object here
IF @@ERROR <> 0 @@TRANCOUNT > 0
BEGIN
ROLLBACK;
END
IF @@TRANCOUNT = 0
BEGIN
INSERT INTO #tmpErrors (Error)
VALUES (1);
BEGIN TRANSACTION;
END
最后,如果已注册错误,则回滚整个事务:
IF EXISTS (SELECT * FROM #tmpErrors) ROLLBACK TRANSACTION
GO
IF @@TRANCOUNT>0 BEGIN
PRINT N'The transacted portion of the database update succeeded.'
COMMIT TRANSACTION
END
ELSE PRINT N'The transacted portion of the database update failed.'
GO
注意(如上面的评论中所述)这不包括您的部署前/部署脚本,因此您应该小心地将它们单独包装
下面的链接是Peter Schott的博客 - 我认为上面评论的是同一个人 - 谢谢:)
http://schottsql.blogspot.co.uk/2012/11/ssdt-publishing-your-project.html
他很好地解释了在使用SSMS时如何配置这些设置
使用Visual Studio 2015,我发现默认情况下未设置“包含事务脚本”设置。在[高级...]选项卡下定义发布设置([Build]&gt;&gt; [Publish {project name} ...])时,您必须选择此项: