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

25

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

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

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

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

预览就停止了,并且没有生成脚本。

4个回答

37
当目标数据库中存在一个存储过程(或视图、约束或其他对象),它未包含在您的sqlproj中,但引用了将会被部署您的sqlproj更改的表时,就会发生这种情况。显然,除非引用的内容包含在您的sqlproj中,否则SSDT无法确定更改是否安全,并且会在安全方面出现错误,从而阻止部署。
禁用“如果可能发生数据丢失,则阻止增量部署”选项仅放宽了数据丢失检查。没有“如果运行时错误可能发生,则阻止增量部署”的选项。
您有三个选择:
  1. 将目标数据库中的存储过程、视图或其他内容添加到您的sqlproj中
  2. 在ssdt发布选项中取消选中“验证部署”选项(除非您知道其他相关的存储过程,并且知道它们不会出错,否则这是很危险的)
  3. 如果您确信目标数据库应该存在的所有内容都包含在您的sqlproj中,您可以启用“删除目标中但源中不存在的对象”选项

1
  1. 手动向数据库添加/删除对象,以便dacpac不会发现差异。我认为像删除列这样的操作是一次性的。
- Raf
1
这是正确的。我还建议执行模式比较以查找源数据库和目标数据库之间的差异。对我来说,问题出在数据库中自动创建的统计信息上。删除它们对我有用! - Shreyak
我曾经遇到过这个问题,它与模式绑定视图有关。我不得不编写逻辑来枚举所有的模式绑定视图,保留它们的脚本,删除它们,执行SSDT自动部署,并在之后重新创建先前删除的视图。 - Cee McSharpface
还有一件事:请检查您的脚本是否意外地标记为“不在构建中”之一。由于此原因,我遇到了“如果执行此部署,则未命名的内容将被删除并且不会重新创建”的异常。 - Juozas
如果这是解决方案,那么如果您使用副本,则会遇到大麻烦。我开始遇到此问题是因为副本创建了插入触发器,导致出现“已被阻止”的错误。我可以告诉您,将副本 DSS 对象包括到项目中不是一个选择,因为副本对象在不同环境中会发生变化,它们具有不同的 guid_names,所以如果您有一个大型基础设施,您就完蛋了。目前看来,我需要删除并重新创建每个失败的对象,这太疯狂了。 - Yogurtu

1
问题也可能是由于在数据库对象前加上错误的模式而引起的。例如,在存储过程SQL语句中引用了一个表,并且该表被添加了一个不正确的模式名称。
此外,我们为特定安全组设置了一些权限,一旦我们删除了这些权限,解决方案就可以再次构建。为了排除错误,请对项目代码和目标数据库进行模式比较。从数据库中删除差异,直到发布功能正常工作。您从数据库中删除的最后一项是罪魁祸首。

0

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

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

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

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


0

从视图中删除模式绑定可以使发布仅出现警告而成功


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接