消息 1768,级别 16,状态 0,第 1 行
外键“FK_id”引用了不是用户表的对象“dbo.student”。消息 1750,级别 16,状态 0,行 1
无法创建约束。请参阅以前的错误。
spa*_*dba 13
FOREIGN KEY 约束不能引用不同数据库中的表。这是设计使然。
下面是一个例子:
CREATE DATABASE test1
GO
USE test1;
GO
CREATE TABLE tableA (
PK int PRIMARY KEY CLUSTERED
,someColumn varchar(50)
)
GO
CREATE DATABASE test2
GO
USE test2;
GO
CREATE TABLE tableB (
PK int PRIMARY KEY CLUSTERED
,aForeignKey int NULL FOREIGN KEY REFERENCES test1.dbo.tableA(PK)
)
GO
Run Code Online (Sandbox Code Playgroud)
这将引发错误:
Msg 1763, Level 16, State 0, Line 19
Cross-database foreign key references are not supported. Foreign key 'test1.dbo.tableA'.
Msg 1750, Level 16, State 0, Line 19
Could not create constraint. See previous errors.
Run Code Online (Sandbox Code Playgroud)
一个(丑陋的)解决方法是检查数据是否存在于引用表中的触发器:
CREATE TRIGGER TR_Fake_FK ON dbo.tableB
FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS (
SELECT *
FROM INSERTED AS I
WHERE NOT EXISTS (
SELECT *
FROM test1.dbo.tableA AS A
WHERE I.aForeignKey = A.PK
)
)
BEGIN
RAISERROR('Violation of fake constraint',16,1);
ROLLBACK;
END
END
Run Code Online (Sandbox Code Playgroud)
该触发器不会处理外键的级联行为,您还需要在引用表上使用另一个触发器来处理 UPDATE 和 DELETE。换句话说:不要这样做。
编辑:如果您想知道将引用的表“复制”到第二个数据库的 VIEW 或 SYNONYM 是否会起作用(这似乎是您想要做的),则不会。