我目前正在创建一个基本上是另一个数据库的子项的数据库。当我们的客户获得我们的软件他们得到一个数据库,我们称之为MasterBase。该数据库包含两个不同的较小数据库的模式,我们称之为MasterC和MasterF。
我的工作是采用与MasterF相关的所有架构并将它们放在自己的数据库中。问题是MasterC中有很多对表和视图的引用。为了解决这个问题,我将添加一个将MasterF与MasterC配对的属性,这样在我的.NET解决方案中,我应该可以执行以下操作:
表tableName ....(在MasterF中创建的表) 参考文献.... MasterC.dbo.tableC(MasterC中的表格)
但是,在SQL中,这会引发错误:不支持MSG 1763跨数据库外键引用。
我已经阅读过最常见的工作是添加一个触发器,但看到这是不是那么安全,并且有很多这样的实例我想知道是否有另一种方式,也许是存储过程或类似的东西
如果一个触发器确实是最好的/唯一的方式,并且我必须为每个有这个问题的表添加一个触发器,我将如何编写这个触发器,我知道一点SQL但很难精通。
请帮忙!
答案 0 :(得分:1)
根据你对个人构建的最后评论,我想我会说客户“需要”两者的门槛就是当他们......好吧,“需要”两者。听起来几乎就像你需要一个第三个模式,对于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;