2011-01-20 5 views
1

Извините за странный титул, не знаете, как лучше назвать Q. Итак:Oracle: ограничение, которое зависит от другой таблицы

У меня есть 3 стола. EntityA, EntityB, AB. Классическая реализация «многие-ко-многим».

Есть ли возможность создать ограничение, что мандаты ВСЕГДА иметь по крайней мере одно соотношение между А и В.

Пример рабочего процесса:

а) вставить, Вставка B, вставить отношение, совершить ; SUCCESS
b) Вставить A, Вставить B, зафиксировать; FALSE

Вопрос в следующем: есть ли какой-либо on commit триггер? Или что-то подобное.

ответ

2

Нет такой вещи, как триггер ON COMMIT. Однако вы можете в целом имитировать поведение триггера ON COMMIT с использованием материализованных представлений. В вашем случае, вы можете

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

Когда вы совершаете фиксацию, происходит материализованное представление. Если ограничение на материализованное представление выходит из строя, коммит не выполняется.

+0

Ну, да, это может сработать. Спасибо за ответ, но я только что создал процедуру пакета, которая принимает все данные и проверяет их. – zerkms

0

Вы можете установить отложенные ограничения на AB, который будет проверять правильность значений только при фиксации того же самого. Вы можете настроить PK таблицы AB в таблицах EntityA и EntityB для ссылок или наоборот (в зависимости от того, установлены ли отложенные ограничения). Предполагая, что эти вставки находятся в рамках одной и той же транзакции, возможно, вы можете выполнить ее изменение, если в таблицу AB нет действительной записи.

+0

Ну, я создал отложенное ограничение на AB. Это не срабатывает в случае 'b)'. – zerkms

Смежные вопросы