繁体   English   中英

另一个数据库中的SQL外键

[英]SQL Foreign Key in Another Database

我目前正在工作中创建一个数据库,该数据库实质上是另一个数据库的子级。 当我们的客户获得我们的软件时,他们就会获得一个数据库,称其为MasterBase。 该数据库包含两个不同的较小数据库的架构,将它们称为MasterC和MasterF。

我的工作是采用与MasterF相关的所有架构,并将其放入自己的数据库中。 问题是MasterC中有很多对表和视图的引用。 要解决此问题,我将添加一个将MasterF与MasterC配对的属性,以便在我的.NET解决方案中,我应该能够执行以下操作:

表tableName ....(在MasterF中创建表)引用.... MasterC.dbo.tableC(MasterC中的表)

但是,在SQL中这会引发错误:MSG 1763跨数据库外键引用不受支持。

我读过最常见的解决方法是添加一个触发器,但是看到它不是那么安全,并且有很多这样的实例,我想知道是否还有另一种方法,也许是存储过程或类似的东西。

如果触发器确实是最好的/唯一的方法,并且我必须向每个有此问题的表添加一个触发器,那么我将如何编写该触发器,我知道一点点SQL,但是很难精通。

请帮忙!

  • 触发器(如您所述)...
  • 数据库分区...
  • 从MasterC复制表(它们是事务性的吗?它们多久更新一次?MasterC是否需要更新?如果需要,您是否可以允许每24小时更新一次副本,等等,例如通过“作业”进行?)

根据您对单个构建的最后评论,我想我想说的是,客户何时“需要”两个客户的门槛是……他们两个都“需要”的时间。 对于MasterC中不引用MasterF的表,对于要分类为不需要两者的客户端,这听起来几乎就像您需要第三个架构。

顺便说一句-这都是关于参照完整性的,是吗? 除了“关系”,您还可以采用其他策略来实现该目标。

编辑

CREATE TRIGGER myTrigger ON myTable
AFTER INSERT
AS
IF NOT EXISTS (SELECT * FROM OtherDatabase.otherschema.othertable F
           JOIN inserted AS i 
           ON F.KeyYouAreLookingFor = i.KeyYouHave)
BEGIN
RAISERROR ('Lookup Value Not Found -- Insert Failed', 16, 1);
ROLLBACK TRANSACTION;
RETURN 
END;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM