如何实现跨数据库外键约束?

时间:2010-09-07 12:45:30

标签: asp.net sql oracle nhibernate

假设我有两种架构: HR 订单

[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的域对象。

2 个答案:

答案 0 :(得分:7)

一种选择是在[Orders]上创建Employees的物化视图,然后将其用作外键的父项。

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

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

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

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

答案 1 :(得分:1)

据我所知,只在一个数据库中支持约束和引用完整性。

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