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