需要解决SSDT循环引用/未解析引用的问题。

6

我刚开始尝试使用SSDT就遇到了问题。

我的解决方案由两个数据库组成。这两个数据库通过使用同义词相互引用。因此在SSDT看来,存在循环引用问题。

我知道这种安排存在设计问题,所以不需要对此进行评论,也不建议对数据库本身进行结构更改。这是一个现有的系统,我没有权限对其进行结构性更改。

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

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


这两个数据库之间有多少个对象是相互依赖的?如果只有几个,您可以考虑通过将它们包含在一个数据库项目的后部署脚本中来强制部署它们。这将节省您创建第三个数据库项目的时间。 - Dan Nolan
这是关于两个数据库中大约30-40个触发器的问题。这是一个双向接口,用于使旧系统从新系统更新并反之亦然(编写成本比新系统还要高!但客户永远是对的 :))。无论如何,我现在已经将触发器从SSDB项目中移除,并将它们添加为您建议的发布后操作。我认为我已经找到了一种通过更改Extended TSQL Verification属性来停止同义词创建错误的方法。 - Mr McGoo
实际上,将数据库分成两个项目并不意味着它变成了两个数据库。这些被称为复合项目。请参见http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/01/implementing-sql-server-solutions-using-visual-studio-2010-database-projects-a-compendium-of-project-experiences.aspx。 - vstrien
这里解释了一种管理循环依赖的方法:http://stackoverflow.com/a/34819649/416988 - lucazav
1个回答

4

正如评论中提到的那样,我建议将触发器以命令式方式部署为两个现有数据库项目中的“Post-Deployment”脚本之一。

请注意,这样做会导致您无法在SSDT数据库项目中对触发器本身进行任何引用(除非这些对象也包含在“Post-Deployment”脚本中)。不确定是否存在一种对象类型实际上可以依赖于触发器,但无论如何,我认为值得一提 :)


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