【问题标题】:SSDT transactional publish?SSDT 事务性发布?
【发布时间】:2014-10-22 07:04:45
【问题描述】:

将 msbuild 与 SSDT 一起使用,我尝试过 IncludeTransactionalScripts,但它似乎只将每个语句放在单独的事务中。 是否可以将多个数据库项目作为事务发布? 如果没有,我至少可以确保每个项目都在事务中发布吗?

【问题讨论】:

  • 我认为如果您选择该选项,它现在就可以做到这一点。它在每次操作后检查错误,如果发现错误,则为架构更改部分中完成的所有操作发出 ROLLBACK。 (部署前和部署后部分是独立的,不在此范围内。)
  • 你确定吗?查看脚本它会生成多个 BEGIN 和 COMMIT 事务,就像每个更改都在它自己的事务中一样。我想要一笔大交易。当然,如果有很多变化可能是不切实际的,但有时它会很有用。
  • 如果出现错误,它肯定会回滚架构更改部分中的所有内容。当我依赖于尚未创建的数据库/表时,我痛苦地尝试只推送数据库项目的一部分,我知道这一点。在脚本中查找“IF @@ERROR 0”部分,您不应该看到多个提交,只是回滚。
  • 谢谢,你是对的,我将不得不尝试进行“外部事务”来处理前置/后置脚本。
  • 最好的办法是处理某种版本或依赖项,可能是部署前的“Begin Tran”和部署后的“提交/回滚”。我不知道如何将这三个部分联系在一起,以便 everything 本身成功或失败。 :(

标签: msbuild sql-server-data-tools


【解决方案1】:

对于发现此问题但不知道在哪里查找的其他人:

有一个发布设置“包括事务脚本”,它在发布脚本开始时开始事务。然后它将脚本中的每个模式更改包装在错误检查中。发生错误时,事务会回滚并增加错误日志,但随后事务会从头开始。如果没有错误,事务继续未提交

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

请注意(如上面的 cmets),这不包括您的部署前/部署后脚本,因此您应该小心单独包装这些脚本


下面的链接是 Peter Schott 的博客 - 我认为是上面评论的同一个人 - 谢谢 :)

http://schottsql.blogspot.co.uk/2012/11/ssdt-publishing-your-project.html

他很好地解释了如何在使用 SSMS 时配置这些设置


使用 Visual Studio 2015,我发现默认情况下没有设置“包含事务脚本”设置。在 [Advanced...] 选项卡下定义发布设置([Build]>>[Publish {project name} ...])时,您必须选择此项:

【讨论】:

  • 谢谢,有没有办法把(predeployment+dacpac+postdeployment)中的事务打包成一个事务?
猜你喜欢
  • 2019-01-27
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
相关资源
最近更新 更多