Поддерживают ли триггеры атомарность, даже если приложение падает - PullRequest
1 голос
/ 08 октября 2010

У меня есть ситуация, когда у меня есть 2 таблицы, в которых я могу сделать Вставить, Обновить, Удалить. Я ввожу таблицу audit_trail, чтобы вести журнал изменений этих двух таблиц. Теперь ввести значения в таблицу aud_trail, которую я имеюписьменные операторы вставки после любого обновления, удаления или вставки в любой из таблиц. Теперь, если изменение произошло в одной из таблиц и приложение завершилось сбоем, тогда по моему методу вставка таблицы аудита не произойдет. Поэтому я хотел знать,написать триггер для условия после вставки, обновления или удаления в этой таблице, и это приведет к вставке в аудит, даже если приложение аварийно завершит работу. СУБД - Oracle

Ответы [ 2 ]

3 голосов
/ 09 октября 2010

Это одно из немногих, возможно, единственно допустимых вариантов использования прагмы AUTONOMOUS_TRANSACTION . Это позволяет нам выдавать SQL в дискретной транзакции, что означает, что материал фиксируется без влияния на более широкую транзакцию. Следовательно, ваши сообщения аудита будут зафиксированы, даже если база данных выйдет из строя до того, как пользователь выполнит явное принятие (или что-то еще).

Очевидно, я не знаю, какие данные вы хотите регистрировать, но напишите такую ​​процедуру и вызовите ее из ваших триггеров:

procedure write_audit
    (p_table_name in audit_table.table_name%type
        , p_action in audit_table.action%type )
is
    pragma autonomous_transaction;
begin
    insert into audit_table
        (id, table_name, ts, action)
    values
        (audit_id.nextval, p_table_name, systimestamp, p_action);
    commit;
end write_audit;
1 голос
/ 09 октября 2010

Вам нужно переместить вставку в хранимую процедуру и вызвать ее из триггера журнала аудита.

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

Подробнее см. В руководстве: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/sqloperations.htm#sthref1514

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