一尘不染

您可以在SQLServer 2k5的链接服务器表视图上使用外键吗?

sql

我有一个带有链接服务器的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。

有什么办法可以达到同样的效果?


阅读 172

收藏
2021-03-10

共1个答案

一尘不染

外键不能连接到非本地对象-
它们必须引用本地表。您收到“最大前缀数”错误,因为您引用的表具有4部分的名称(LinkedServer.Database.Schema.Object),而本地对象只有3部分的名称。

其他解决方案:

  1. 将数据从源(视图的位置)复制到与您要在其中添加键的表相同的服务器上。您可以每小时,每天或以其他方式执行此操作,具体取决于源数据的更改频率。
  2. 在源表上添加触发器,以将所有更改推送到本地副本。这基本上与#1相同,但是会立即发生变化
  3. 在您的表中添加一个INSTEAD OF“触发器,该触发器通过从链接服务器中进行选择并比较您尝试进行INSERT / UPDATE的值来手动检查外键约束。如果不匹配,则可以拒绝更改。
2021-03-10