【问题标题】:SSDT circular reference/unresolved reference workaround needed需要 SSDT 循环引用/未解析的引用解决方法
【发布时间】:2018-09-12 19:26:14
【问题描述】:

我刚刚开始涉足 SSDT 并遇到了问题。

我的解决方案包含 2 个数据库。两个数据库都使用同义词相互引用。因此,就 SSDT 而言,我们有循环引用。

我知道这种安排的设计问题,因此无需对此发表评论,也无需建议对数据库本身进行结构更改。这是一个现有的系统,我无权从结构上改变它。

我也知道 SSDT 不允许循环引用这一事实。这里有一个解决方法(http://social.msdn.microsoft.com/Forums/en-US/ssdt/thread/5fd12f01-54e6-4e7d-b7e2-14fa9df9a7ef)。 它建议将 DB1 拆分为 2 个项目 DB1 和 DB1a,例如其中 DB1a 引用 DB1 和 DB2,并使 DB2 引用 DB1。但我不确定如何在不实际创建额外数据库的情况下对其进行配置。

我认为我唯一的选择是将其保留为 2 个项目,但将它们设置为忽略未解决的引用。

【问题讨论】:

  • 这两个数据库之间有多少对象是相互依赖的?如果只有几个,您可能想考虑通过将它们包含在其中一个数据库项目的部署后脚本中来强制部署它们。这将节省您创建第三个数据库项目的时间。
  • 两个数据库中大约有 30-40 个触发器。这是一个双向接口,可以让旧系统从新系统中更新,反之亦然(编写成本比新系统高!但客户永远是对的 :))。无论如何,我现在已经从 SSDB 项目中删除了触发器,并将按照您的建议将它们添加为后期部署。我想我已经找到了一种通过更改扩展 TSQL 验证属性来停止同义词创建错误的方法。
  • 实际上,将数据库拆分为两个项目并不能使其成为两个数据库。这些被称为复合项目。另见sqlblog.com/blogs/jamie_thomson/archive/2012/01/01/…
  • 这里解释了一种管理循环的方法:stackoverflow.com/a/34819649/416988

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


【解决方案1】:

正如 cmets 中所述,我建议在两个现有数据库项目中的任何一个中将触发器强制部署为部署后脚本。

请注意,通过这样做,您将无法在 SSDT 数据库项目中对触发器本身进行任何引用(除非这些对象也包含在部署后脚本中)。不确定是否确实存在可能依赖于触发器的对象类型,但我认为无论如何都值得一提:)。

【讨论】:

  • 谢谢丹尼尔。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
相关资源
最近更新 更多