创建发布预览时的 SSDT 发布错误

SSDT Publish errors on Creating Publish Preview

我正在使用 Visual Studio 2013 来管理包含我们的数据库架构的 .sqlproj 文件。该架构已成功部署数十次。

当试图发布到一个特定的目标数据库时,"Creating publish preview" 步骤似乎失败了,但没有给出错误。预览的输出包括一些预期的警告:

我没有勾选 "Block incremental deployment if data loss might occur"。

预览刚刚停止,没有生成脚本。

最后一个警告模式似乎不仅仅是一个警告:

This deployment may encounter errors during execution because changes to {...} are blocked by {...}'s dependency in the target database

似乎是停止其余预览和脚本生成的罪魁祸首。

有趣的是,引入的架构更改不会破坏预览输出中引用的触发器。

当目标数据库中存在一个存储过程(或视图或约束或其他对象)时会发生这种情况,该存储过程未包含在您的 sqlproj 中,它引用了一个 table 将通过部署更改你的 sqlproj。 SSDT 显然无法确定更改是否安全,除非引用的内容包含在您的 sqlproj 中,然后它通过阻止部署在安全方面出错。

禁用"Block incremental deployment if data loss might occur"选项只会放宽数据丢失检查。没有 "Block incremental deployment if run-time errors might occur" 选项。

您有三个选择:

  1. 将目标数据库中的任何存储过程、视图或任何内容添加到您的 sqlproj

  2. 取消选中 ssdt 发布选项中的 "Verify Deployment" 选项(这很危险,除非您知道其他引用存储过程并且知道它们不会中断)

  3. 如果您确定目标数据库中应该存在的所有内容都包含在您的 sqlproj 中,您可以启用 "Drop objects in target but not in source" 选项

问题也可能是由于在数据库对象前添加了错误的架构。例如,在存储过程 SQL 语句中引用了 table,而 table 前面加上了不正确的模式名称。

此外,我们对特定安全组有一些权限,一旦我们删除该解决方案就会重新构建。为了解决错误,请执行项目代码和目标数据库的架构比较。从数据库中删除差异,直到发布功能起作用。您从数据库中删除的最后一项是您的罪魁祸首。

从视图中删除模式绑定允许发布成功,但只有警告