创建发布预览时出现 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 发布错误的主要内容,如果未能解决你的问题,请参考以下文章
提交应用预览时出现 MOV_RESAVE_CORRUPTED 错误