Как определить триггер ON COMMIT в Oracle? - PullRequest
19 голосов
/ 04 ноября 2010

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

Ответы [ 2 ]

30 голосов
/ 04 ноября 2010

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

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

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

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

1 голос
/ 05 июля 2017

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

Другое возможное решение, которое также предлагает «Спросить Тома», - это указать хранимую процедуру и просто вызвать ее.Процедура перед выполнением COMMIT.Это решение удобно, только если у вас есть доступ к коду, который выполняет COMMIT, но для моего случая это было самое простое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...