База данных Oracle при откате сбоя триггера - PullRequest
2 голосов
/ 24 апреля 2010

Я хочу создать триггер, который выполняется при обновлении таблицы.

, в частности, при обновлении таблицы. Я хочу обновить другую таблицу с помощью триггера, но если триггер не работает (REFERENTIAL INTEGRITY-- ENTITYINTEGRITY) я больше не хочу выполнять обновление.

Есть предложения о том, как это сделать?

Лучше ли использовать триггер или делать его анаграмматически с помощью хранимой процедуры?

Спасибо

Ответы [ 2 ]

3 голосов
/ 24 апреля 2010

DML в триггере является частью того же действия, что и триггер DML. И то, и другое должно быть успешным или неудачным. Если триггер вызывает необработанное исключение, весь оператор откатывается.

Вот триггер на T23, который копирует строку в T42.

SQL> create or replace trigger t23_trg
  2      before insert or update on t23 for each row
  3  begin
  4      insert into t42 values (:new.id, :new.col1);
  5  end;
  6  /

Trigger created.

SQL>

Успешная вставка в T23 ...

SQL> insert into t23 values (1, 'ABC')
  2  /

1 row created.

SQL> select * from t42
  2  /

        ID COL
---------- ---
         1 ABC

SQL>

Но этот не удастся из-за уникального ограничения на T42.ID. Как видите, оператор триггера тоже откатывается ...

SQL> insert into t23 values (1, 'XYZ')
  2  /
insert into t23 values (1, 'XYZ')
            *
ERROR at line 1:
ORA-00001: unique constraint (APC.T24_PK) violated
ORA-06512: at "APC.T23_TRG", line 2
ORA-04088: error during execution of trigger 'APC.T23_TRG'


SQL> select * from t42
  2  /

        ID COL
---------- ---
         1 ABC

SQL> select * from t23
  2  /

        ID COL
---------- ---
         1 ABC

SQL>
0 голосов
/ 24 апреля 2010

В случае сбоя триггера он вызовет исключение (если вы не указали этого специально), и в этом случае у вас будет откат клиента. На самом деле не имеет значения, выполнено ли это с помощью триггера или SP (хотя часто рекомендуется хранить логическую транзакцию внутри SP, а не распределять ее по триггерам).

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