我目前正在创建一个数据库,本质上是另一个数据库的子数据库。当我们的客户得到我们的软件时,他们会得到一个数据库,我们称之为MasterBase。这个数据库包含两个不同的较小数据库的模式,我们称它们为MasterC和MasterF。
我的工作是把所有属于MasterF的模式放在他们自己的数据库中。问题是MasterC中有很多对表和视图的引用。为了解决这个问题,我将添加一个属性,将MasterF与MasterC配对,以便在我的。net解决方案中,我应该能够执行以下操作:
表的表…(表正在MasterF中创建)参考文献MasterC.dbo. tablec (MasterC中的表)
但是,在SQL中,这会引发错误:MSG 1763不支持跨数据库外键引用。
我读过最常见的工作是添加一个触发器,但看到这不是那么安全,而且有很多这样的实例,我想知道是否有另一种方法,也许是存储过程或类似的东西。
如果触发器真的是最好的/唯一的方法,并且我必须为每个有这个问题的表添加一个触发器,我该如何编写这个触发器,我知道一点SQL,但很难精通。
请帮忙!
- 触发器(如你所述)…
- 数据库分区… 从MasterC复制表(它们是事务性的吗?)它们多久更新一次?MasterC需要更新吗?如果是这样,您是否可以允许每24小时更新一次副本,等等,通过"Job"?)
根据你最后关于单独构建的评论,我想我会说客户端"需要"两者的阈值是当他们…嗯,两者都"需要"。听起来好像你需要第三种模式,对于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;