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

Posted

技术标签:

【中文标题】创建发布预览时出现 SSDT 发布错误【英文标题】:SSDT Publish errors on Creating Publish Preview 【发布时间】:2015-04-21 12:09:36 【问题描述】:

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

当尝试发布到一个特定的目标数据库时,“创建发布预览”步骤似乎失败,但没有给出错误。预览的输出包括一些预期的警告:

正在删除列 ...,可能会发生数据丢失 如果执行此部署,对 ... 的更改可能会在 ... 中引入运行时错误 此部署在执行过程中可能会遇到错误,因为目标数据库中的 ... 依赖项阻止了对 ... 的更改

我已取消选中“如果可能发生数据丢失,阻止增量部署”。

预览只是停止,没有生成任何脚本。

【问题讨论】:

【参考方案1】:

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

此部署在执行过程中可能会遇到错误,因为更改 到 ... 被目标数据库中 ... 的依赖项阻止

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

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

【讨论】:

【参考方案2】:

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

禁用“如果可能发生数据丢失,阻止增量部署”选项只会放松数据丢失检查。没有“如果可能发生运行时错误则阻止增量部署”选项。

您有三个选择:

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

    取消选中 ssdt 发布选项中的“验证部署”选项(这很危险,除非您知道其他引用存储过程并知道它们不会中断)

    如果您确定目标数据库中应该存在的所有内容都包含在您的 sqlproj 中,您可以启用“将对象拖放到目标而不是源”选项

【讨论】:

4.从数据库中手动添加/删除对象,这样 dacpac 就不会发现差异。我认为删除一列等操作是一次性的。 这是正确的。我还建议进行模式比较以找出源数据库和目标数据库之间的差异。对我来说,这是在数据库中自动创建的统计数据。删除它们对我有用! 我有这个与模式绑定的视图。必须编写逻辑来枚举所有模式绑定的视图,保留它们的脚本,删除它们,执行 SSDT 自动部署,然后重新创建以前删除的视图。 还有一件事:检查或您的某个脚本意外未标记为“不在构建中”。因此,我有“如果执行此部署,未命名的将被删除并且不会重新创建”异常。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于创建发布预览时出现 SSDT 发布错误的主要内容,如果未能解决你的问题,请参考以下文章

进行预览时出现 Bigquery API 限制超出错误

提交应用预览时出现 MOV_RESAVE_CORRUPTED 错误

IBM Worklight - 部署 dojo 应用程序时出现 dojo script.js:21 错误

运行查询以创建表时出现错误 1064?

创建 VertexArray 时出现分段错误

创建 mongo debezium 连接器时出现身份验证错误