无法通过数据库引用跨数据库创建表约束
Posted
技术标签:
【中文标题】无法通过数据库引用跨数据库创建表约束【英文标题】:Can't create table constraint across databases via database reference 【发布时间】:2015-01-06 17:45:14 【问题描述】:在 Visual Studio 2013 中,我在同一个解决方案(DatabaseA 和 DatabaseB)中设置了两个数据库项目,DatabaseA 具有对 DatabaseB 的“数据库引用”。
这一切看起来都很棒,所以我在 DatabaseB 中创建了 TableB,然后在 DatabaseA 中创建了一个视图来获取 TableB 中的数据。
CREATE VIEW [dbo].[vDatabaseB]
AS SELECT Id FROM [$(DatabaseB)].dbo.TableB
完美运行。我现在在 DatabaseA 中创建一个 TableA,它对 TableB 有一个外键约束。
CREATE TABLE [dbo].[TableA]
(
[Id] INT NOT NULL PRIMARY KEY,
[TableBID] INT NOT NULL
CONSTRAINT FK_TableA_TableBID FOREIGN KEY (TableBId) REFERENCES [$(DatabaseB)].dbo.TableB(Id) ON DELETE CASCADE,
不幸的是,这并没有建立:
Error SQL71501: Foreign Key: [dbo].[FK_TableA_TableBID] has an unresolved reference to Column [dbo].[TableB].[Id]. DatabaseA TableA.sql 5
如何让这个表约束起作用?我还在 Visual Studio 2015(预览版)中对此进行了测试,结果相同。
【问题讨论】:
【参考方案1】:如果项目部署到同一个数据库:
添加引用时,选择“数据库位置”下的“相同数据库”。
当您这样做时,您将不需要使用数据库名称变量,它应该可以正常工作。
部署时,如果复合对象不存在或您选择删除所有对象,则需要确保已包含复合对象。
如果你实际上有两个不同的数据库,那么 sql 不支持跨数据库外键,你需要实现一个触发器 (yuck) 来支持它
【讨论】:
不幸的是,这是两个独立的数据库项目(部署到 sql server 上的两个独立数据库)。你有跨数据库外键限制的参考/链接吗? 请参阅technet.microsoft.com/en-us/library/… - 此处的注释说明您只能为同一数据库中的表创建 FK。 (我没有针对驻留在另一个数据库中的表的同义词尝试此操作。) 这里有更多细节和示例触发器:***.com/questions/4452132/… 感谢彼得的链接。 MSDN 对此含糊其辞,让我发笑,但今天早上与我共事的另一位 DBA 证实了同样的事情。我们对多个数据库的使用仍然有意义,所以我们不会有这个限制。 知道 Peter 我如何将您的评论标记为答案(您不能跨数据库创建 FK,这通常是个坏主意)以上是关于无法通过数据库引用跨数据库创建表约束的主要内容,如果未能解决你的问题,请参考以下文章