2

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

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

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

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

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

如果触发器真的是最好/唯一的方法,我必须为每个有这个问题的表添加一个触发器,我将如何编写这个触发器,我知道一点 SQL,但几乎不精通。

请帮忙!

4

1 回答 1

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

根据您对个人构建的最后评论,我想我会说客户“需要”两者的阈值是当他们......嗯,“需要”两者时。听起来您几乎需要第三种模式,对于不引用 MasterF 的 MasterC 中的表,对于您分类为不需要两者的客户端。

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

编辑

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;
于 2014-06-03T16:20:16.107 回答