Как реализовать ограничение внешнего ключа между базами данных? - PullRequest
4 голосов
/ 07 сентября 2010

Допустим, у меня есть две схемы: 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 ]

7 голосов
/ 07 сентября 2010

Один из вариантов - создать материализованное представление «Сотрудники» в [Заказы], а затем использовать его в качестве родительского для внешнего ключа.

Конечно, у этого есть некоторые недостатки.В частности,

- вы не сможете выполнить полное обновление материализованного представления, не отключив внешний ключ, поэтому его придется быстро обновить.

- ключи, введенные в СОТРУДНИКИ, не будут доступны ЗАПИСИ, пока материализованное представление не обновится.Если это важно, вы можете настроить его на обновление при коммите.

Другими альтернативами являются ручное управление ключами с помощью триггера или процесса последующей очистки.Или убедите администраторов баз данных, что эти схемы могут находиться в одном и том же экземпляре базы данных.

1 голос
/ 07 сентября 2010

Насколько я знаю, ограничения и ссылочная целостность поддерживаются только в одной базе данных.

Если вам нужно пересечь границы базы данных, вам нужно быть креативным. Может быть, написать несколько триггеров, проверяющих данные в другой базе данных, или применить эти ограничения на уровне приложения. Но тогда вы можете столкнуться с проблемой, когда объем транзакции ограничен одной базой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...