У нас есть 2 базы данных - DB1 и DB2.
Я могу составить таблицу в DB1, который имеет отношение с одной из таблиц в DB2? Другими словами, у меня может быть Внешний ключ в моей таблице от другой базы данных?
Я соединяюсь с этими базами данных с различными пользователями. Какие-либо идеи?
Прямо сейчас я получаю ошибку:
РТЫ-00942:Table или представление не существуют
Нет, Oracle не позволяет создавать ограничение внешнего ключа, которое ссылается на таблицу через ссылку на базу данных. Вам придется использовать триггеры для обеспечения целостности.
Один из способов справиться с этим - создать материализованное представление главной таблицы в локальной базе данных, а затем создать ограничение целостности, указывающее на MV.
Это работает. Но это может привести к некоторым проблемам. Во-первых, если вам когда-либо понадобится полностью обновить материализованное представление, вам нужно будет отключить ограничение, прежде чем делать это. В противном случае Oracle не сможет удалить строки в MV до ввода новых строк.
Во-вторых, вы можете столкнуться с некоторыми задержками по времени. Например, скажем, вы добавляете запись в главную таблицу на удаленном сайте. Затем вы хотите добавить дочернюю запись в локальную таблицу. Но клип будет обновляться ежедневно, а этого еще не произошло. Вы получите нарушение внешнего ключа просто потому, что MV не обновился.
Если вы пойдете по этому пути, ваш самый безопасный подход - настроить MV на быстрое обновление при фиксации главной таблицы. Это будет означать, что соединение с БД должно оставаться открытым почти все время. И у вас будет работа администратора, если вам когда-нибудь понадобится выполнить полное обновление.
В общем, мы обнаружили, что триггер проще. В некоторых случаях мы просто определили FK в нашей логической модели, но реализовали его вручную, настроив ежедневное задание, которое будет проверять наличие нарушений и предупреждать персонал. Конечно, мы очень осторожны, поэтому такие предупреждения встречаются крайне редко.