【问题标题】:How to implement a cross-database foreign key constraint?如何实现跨数据库外键约束?
【发布时间】:2011-04-09 04:41:19
【问题描述】:

假设我有两个架构:HR 和 Orders。

[HR].Employees         [Orders].Entries
--------------         ----------------
Id_Employee    ---->   Employee
Fullname               Id_Entry
Birthday               Description
                       Amount

如您所见,我想要的是能够建立一个跨数据库的外键,但是当我使用数据库链接尝试这个时,我得到:

-- From [Orders]
ALTER TABLE Entries
    ADD CONSTRAINT FK_Entries_Employees FOREIGN KEY (Employee)
    REFERENCES Employees@HR;
COMMIT;

ORA-02021: DDL operations are not allowed on a remote database

有没有办法解决这个问题?这是一个遗留数据库,所以我无法更改现有架构。

对于 NHibernate 人群:然后我会使用这种关系来映射 NHibernate 的域对象。

【问题讨论】:

    标签: asp.net sql oracle nhibernate


    【解决方案1】:

    一种选择是在 [Orders] 上创建员工的具体化视图,然后将其用作外键的父级。

    当然,这有一些缺点。特别是,

    -- 如果不禁用外键,您将无法完全刷新物化视图,因此必须快速刷新。

    -- 在实体化视图刷新之前,输入到 EMPLOYEES 中的键对 ENTRIES 不可用。如果这很关键,您可能希望将其设置为在提交时刷新。

    其他替代方法是通过触发器或通过后清理过程自行处理密钥强制执行。或者让 DBA 相信这些模式可以驻留在同一个数据库实例上。

    【讨论】:

    • 谢谢。我以前从未使用过物化视图。话虽如此,您将如何禁用提交约束以刷新物化视图?再次感谢。
    • 另一个问题是您是否必须将任一数据库还原到某个时间点。这会使数据库不同步
    • 对于这种类型的任何物化视图,您都在使用 DB 链接对主表进行查询。如果你做对了,你可以让 MV 进行一次“快速”刷新——也就是说,只需在 MV 中插入/更新/删除已经在 master 中修改的行。为此,您应该在主表上有一个主键。然后您需要根据该 PK 为主表创建一个物化视图日志。并将物化视图创建为“使用主键快速刷新”,因此它只会处理增量更改。然后,您可以将刷新设置为按计划或 ON COMMIT 完成。
    • 如果您的数据库链接作为拥有主表的模式连接,那就是这样。如果不是,您需要查看手册以了解一些细节——比如在物化视图查询中完全限定主服务器的名称,因为它们并不真正喜欢同义词。
    【解决方案2】:

    据我所知,约束和参照完整性仅在一个数据库中得到支持。

    如果您需要跨越数据库的界限,就必须要有创意。也许编写一些触发器检查其他数据库中的数据或在应用程序级别强制执行这些约束。但是你可能会遇到事务范围仅限于一个数据库的问题。

    【讨论】:

    猜你喜欢
    • 2015-05-17
    • 2010-10-14
    • 1970-01-01
    • 2021-11-20
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多