Подтвердить что ты не робот

Как определить триггер ON COMMIT в Oracle?

Есть ли способ в базе данных оракула определить триггер, который будет запущен синхронно до COMMIT (и ROLLBACK, если он вызывает исключение) в случае, если указанная таблица изменена?

4b9b3361

Ответ 1

В Oracle нет механизма запуска ON COMMIT. Однако есть обходные пути:

  • Вы можете использовать материализованное представление с ON COMMIT REFRESH и добавить триггеры к этому MV. Это позволит вам вызвать логику, когда базовая таблица была изменена во время фиксации. Если триггер вызывает ошибку, транзакция будет отброшена (вы потеряете все неуправляемые изменения).

  • Вы можете использовать DBMS_JOB для отсрочки действия после коммита. Это было бы асинхронным действием и может быть желательно в некоторых случаях (например, если вы хотите отправить электронное письмо после успешной транзакции). Если вы откатите основную транзакцию, задание будет отменено. Работа и первичный сеанс независимы: если сбой задания, основная транзакция не будет отменена.

В вашем случае вы, вероятно, можете использовать опцию (1). Я лично не люблю кодировать бизнес-логику в триггерах, поскольку она добавляет много сложности, но технически я думаю, что это было бы выполнимо.

Ответ 2

У меня была аналогичная проблема, но вариант 1, к сожалению, не был удобен для моего случая.

Еще одно возможное решение, также предложенное "Ask Tom", заключается в том, чтобы указать хранимую процедуру и просто вызвать эту процедуру перед выполнением COMMIT. Это решение удобно только в том случае, если у вас есть доступ к коду, который выполняет COMMIT, но для моего случая это было самым простым решением.