Как определить триггер при фиксации в Oracle?
Есть ли способ в базе данных oracle определить триггер, который будет срабатывать синхронно перед фиксацией (и откатом, если он вызывает исключение) в случае изменения указанной таблицы?
2 ответа:
Нет фиксации спускового механизма в Oracle. Однако существуют обходные пути:
Вы можете использовать материализованное представление с обновлением при фиксации и добавить триггеры к этому MV. Это позволит вам запускать логику, когда базовая таблица была изменена во время фиксации. Если триггер вызовет ошибку, транзакция будет откатана (вы потеряете все незафиксированные изменения).
Вы можете использовать DBMS_JOB, чтобы отложить действие до после фиксации. Это будет асинхронное действие и может быть желательно в некоторых случаях (например, когда вы хотите отправить электронное письмо после успешной транзакции). Если вы откатите основную транзакцию, задание будет отменено. Задание и основной сеанс независимы: если задание не выполняется, то откат основной транзакции не выполняется.
В вашем случае, вероятно, можно использовать опцию (1). Лично мне не нравится кодировать бизнес-логику в триггерах, так как она добавляет много сложность, но технически я думаю, что это было бы выполнимо.
У меня была аналогичная проблема, но Вариант 1, к сожалению, не был удобен для моего случая.
Другое возможное решение, которое также предлагает "Ask Tom", состоит в том, чтобы указать хранимую процедуру и просто вызвать ее перед выполнением фиксации. Это решение удобно только в том случае, если у вас есть доступ к коду, который выполняет коммит, но в моем случае это было самое простое решение.