我们有 2 个数据库 - DB1 和 DB2。
我可以在 DB1 中创建一个与 DB2 中的一个表有关系的表吗?换句话说,我的表中可以有来自另一个数据库的外键吗?
我用不同的用户连接到这些数据库。有任何想法吗?
现在,我收到错误:
ORA-00942: 表或视图不存在
不,Oracle 不允许您创建通过数据库链接引用表的外键约束。您将不得不使用触发器来强制执行完整性。
处理此问题的一种方法是在本地数据库上创建主表的物化视图,然后创建指向 MV 的完整性约束。
这样可行。但这可能会导致一些问题。首先,如果您需要完全刷新物化视图,则需要在执行之前禁用约束。否则,Oracle 将无法在引入新行之前删除 MV 中的行。
其次,您可能会遇到一些时间延迟。例如,假设您在远程站点的主表中添加一条记录。然后你想在本地表中添加一条子记录。但是 MV 将每天刷新,而这还没有发生。你会得到一个外键违规,仅仅是因为 MV 没有刷新。
如果你走这条路,最安全的方法是将 MV 设置为在提交主表时快速刷新。这意味着几乎始终保持 DB Link 处于打开状态。如果您需要进行完全刷新,您将需要进行管理工作。
总而言之,我们通常发现触发器更容易。在某些情况下,我们只是在逻辑模型中定义了 FK,但通过设置日常工作来手动实现它,该工作将检查违规情况并提醒员工。当然,我们非常小心,因此这些警报非常罕见。