如何将 DACPAC 部署到事务复制数据库

How to deploy DACPACs to transaction replicated databases

我正在通过 SqlPackage.exe 将 DACPAC 部署到在 SQL 服务器中具有大量事务复制的数据库服务器。 DACPAC 是作为 SQL 服务器数据库项目的输出构建的。当我尝试将 DACPAC 部署到启用了复制的数据库时,SqlPackage 执行 returns 错误,例如 Error SQL72035: [dbo].[SomeObject] is replicated and cannot be modified.

我发现参数 DoNotAlterReplicatedObjects 不会改变打开复制的对象并且会消除这些错误,这不是我想要做的。相反,作为部署的一部分,我想更改所有对象而不考虑复制。

我能想到的将 DACPAC 部署到这些复制数据库的唯一选择是:

  1. 在部署前通过脚本删除复制,
  2. 通过 SqlPackage 部署 DACPAC,
  3. 部署后通过脚本重建复制。

不幸的是,数据库被大量复制,上面的第 3 步需要 7 个多小时才能完成。所以这不是一个实际的解决方案。

有没有更好的方法来使用 SQL 服务器数据库项目和 DACPAC 部署到具有大量复制的数据库?

如有任何帮助,我们将不胜感激。预先感谢您的建议。

我们通过执行以下操作解决了该问题。希望这也适用于其他人。高级想法是您需要禁用“不要更改复制的对象”并启用“忽略列顺序”。

有几种方法可以做到这一点。

  1. 如果您使用的是SqlPackage tool in your deployment pipeline, then use the DoNotAlterReplicatedObjects and IgnoreColumnOrder properties see this link。所以/p:DoNotAlterReplicatedObjects=False /p:IgnoreColumnOrder=True

  2. 如果您使用的是 C# 或 PowerShell Dac 类,则使用 DacDeployOptions.DoNotAlterReplicatedObjects and DacDeployOptions.IgnoreColumnOrder 属性。

  3. 您可以直接修改Visual StudioIDE中的“高级发布设置”。您取消选中 Do not ALTER replicated objects 复选框并启用 Ignore column order 复选框。请参阅此 Whosebug answer 以了解忽略复选框的示例。

我们的理论是,alter table 只能将一列附加到 table 的末尾,因此将列添加到特定位置的唯一方法是删除并重新创建 table。 ignore 告诉发布者将该列附加到末尾,而不管我将该列放在脚本中的什么位置。

所以这可能是一个问题的地方是,如果您在没有指定列列表的情况下执行插入,因为您希望列按特定顺序排列,而它们不是。

您可以 运行 进入的另一个潜在副作用是 DACPAC 创建的 table 可能具有与 DACPAC 更改的 table 不同的列顺序。我们已经使用这个解决方案几个月没有问题,但以上是需要注意的事情。

希望对您有所帮助。