Могу ли я создавать иностранные ключи в базах данных? - PullRequest
7 голосов
/ 04 июня 2010

У нас есть 2 базы данных - DB1 и DB2.

Можно ли создать таблицу в DB1, которая связана с одной из таблиц в DB2? Другими словами, могу ли я иметь в своей таблице внешний ключ из другой базы данных?

Я подключаюсь к этим базам данных с разными пользователями. Есть идеи?

Прямо сейчас я получаю сообщение об ошибке:

ORA-00942: таблица или представление не существует

Ответы [ 2 ]

9 голосов
/ 04 июня 2010

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

8 голосов
/ 04 июня 2010

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

Это работает. Но это может привести к некоторым проблемам. Во-первых, если вам когда-либо понадобится полностью обновить материализованное представление, вам нужно отключить ограничение перед выполнением do. В противном случае Oracle не сможет удалить строки в MV до ввода новых строк.

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

Если вы идете по этому пути, ваш самый безопасный подход - настроить MV на быстрое обновление при фиксации мастер-таблицы. Это будет означать, что ссылка на БД будет открыта почти все время. И вам придется работать администратором, если вам когда-нибудь понадобится выполнить полное обновление.

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

...