我有一个带有链接服务器的SQLServer到另一个其他数据库.我在该链接服务器上创建了一个视图
create view vw_foo as select [id], [name] from LINKEDSERVER.RemoteDatabase.dbo.tbl_bar
我想谈谈以下内容
alter table [baz] add foo_id int not null go alter table [baz] with check add constraint [fk1_baz_to_foo] foreign key([foo_id]) references [dbo].[vw_foo] ([id]) go
但是这会产生错误:"外键'fk1_baz_to_foo'引用对象'dbo.vw_foo',它不是用户表."
如果我尝试使用以下内容将外键直接放在表上
alter table [baz] with check add constraint [fk1_baz_to_bar] foreign key([foo_id]) references LINKEDSERVER.RemoteDatabase.dbo.tbl_bar ([id])
然后我收到以下错误:
对象名称"LINKEDSERVER.RemoteDatabase.dbo.tbl_bar"包含的前缀数量超过最大数量.最大值为2.
有什么方法可以达到同样的效果吗?
外键不能连接到非本地对象 - 它们必须引用本地表.您得到"最大前缀数"错误,因为您引用了具有4部分名称的表(LinkedServer.Database.Schema.Object),而本地对象只有3部分名称.
其他方案:
将数据从源(视图的位置)复制到与您尝试添加密钥的表相同的服务器.您可以按小时,每天或其他任何方式执行此操作,具体取决于源数据更改的频率.
在源表上添加触发器以将任何更改推送到本地副本.这基本上与#1相同,但具有直接的变化
向表中添加一个"INSTEAD OF"触发器,通过从链接服务器中进行选择并比较您尝试INSERT/UPDATE的值来手动检查外键约束.如果它不匹配,则可以拒绝更改.