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

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

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

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

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

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

【问题讨论】:

    标签: sql-server-data-tools sqlcmd dacpac


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      您有三个选择:

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

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

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

      【讨论】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2016-07-29
          • 1970-01-01
          • 2018-06-25
          • 1970-01-01
          • 2019-09-26
          • 1970-01-01
          • 2016-12-27
          • 2011-07-10
          • 1970-01-01
          相关资源
          最近更新 更多