另一个数据库中的SQL外键

时间:2014-06-03 16:07:31

标签: sql database sql-server-2008 foreign-keys cross-database

我目前正在创建一个基本上是另一个数据库的子项的数据库。当我们的客户获得我们的软件他们得到一个数据库,我们称之为MasterBase。该数据库包含两个不同的较小数据库的模式,我们称之为MasterC和MasterF。

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

表tableName ....(在MasterF中创建的表) 参考文献.... MasterC.dbo.tableC(MasterC中的表格)

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

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

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

请帮忙!

1 个答案:

答案 0 :(得分:1)

  • 触发器(正如您所说)......
  • 数据库分区......
  • 从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;