Могу ли я создавать внешние ключи для баз данных?

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

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

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

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

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

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

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

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

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

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

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