sql - 您可以在 SQLServer 2k5 中的链接服务器表的 View 上使用外键吗?

标签 sql sql-server sql-server-2005 foreign-keys linked-server

我有一个 SQLServer,其链接服务器连接到其他地方的另一个数据库。我已经在该链接服务器上创建了一个 View

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])

然后我收到以下错误:

The object name 'LINKEDSERVER.RemoteDatabase.dbo.tbl_bar' contains more than the maximum number of prefixes. The maximum is 2.

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

最佳答案

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

其他解决方案:

  1. 将数据从源( View 位置)复制到与您尝试添加 key 的表相同的服务器。您可以每小时、每天或其他时间执行此操作,具体取决于源数据更改的频率。
  2. 在源表上添加触发器,以将任何更改推送到本地副本。这本质上与 #1 相同,但会立即发生变化
  3. 向您的表添加一个 INSTEAD OF”触发器,该触发器通过从链接服务器中进行选择并比较您尝试插入/更新的值来手动检查外键约束。如果不匹配,您可以拒绝更改.

关于sql - 您可以在 SQLServer 2k5 中的链接服务器表的 View 上使用外键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/442587/

相关文章:

c# - 备份和恢复 SQL 数据库

c# - 将数据从 Sql Server 推送到桌面应用程序

sql - 事务隔离 - INSERTS 依赖于先前的记录值

sql - 如何将表值从一个数据库插入到另一个数据库?

mysql - 如果我的用户存储在另一个数据库中,我是否应该在使用 SQL 数据库的服务中复制它们?

c# - 如何使用 Entity Framework Core 可视化设计我的数据库?

c# - 从远程 SQL Server 获取备份

php - 如何使用php减去mysql中的数量

sql - 如何在 SQL 的 select 语句中分配一个随机值?

sql - 按年和月选择总计数()组?