正如许多答案所述,我认为您应该好好看看复制,特别是在高 TPS 环境中,或者您希望在许多表上都这样做。但是,我将提供一些代码,说明我如何使用链接服务器、同义词和检查约束在我的一些系统中实现您的既定目标。
我想将这些公共数据抽象到一个数据库中,但仍然让其他数据库加入这些表,甚至有键来强制约束等
您可以将数据库中的视图或同义词设置为链接服务器(或其他本地数据库)中的公用表。如果视图本来就是这样,我更喜欢同义词select * from table
。
如果您有权限,表同义词将允许您在远程项目上运行 DML。
不过,此时您的视图或同义词不能有外键,但我们可以通过检查约束来完成类似的事情。
让我们看一些代码:
create synonym MyCentralTable for MyLinkedServer.MyCentralDB.dbo.MyCentralTable
go
create function dbo.MyLocalTableFkConstraint (
@PK int
)
returns bit
as begin
declare @retVal bit
select @retVal = case when exists (
select null from MyCentralTable where PK = @PK
) then 1 else 0 end
return @retVal
end
go
create table MyLocalTable (
FK int check (dbo.MyLocalTableFKConstraint(FK) = 1)
)
go
-- Will fail: -1 not in MyLinkedServer.MyRemoteDatabase.dbo.MyCentralTable
insert into MyLocalTable select -1
-- Will succeed: RI on a remote table w/o triggers
insert into MyLocalTable select FK from MyCentralTable
当然,重要的是要注意,如果您删除中央表中的引用记录,您不会收到错误消息。