Pull to refresh

Comments 10

Не стоит создавать рекурсивные триггера. Т.е., например, триггер after update, в котором выполняется update той же таблицы. В этом случае триггер будет срабатывать рекурсивно до тех пор, пока не закончится память.

Ух ты страсти какие

Всё нормально с памятью
SQL> create table test(a number not null);

Table created.

SQL> insert into test(a) values (0);

1 row created.

SQL> create or replace trigger test_aru
  2  after update
  3  on test
  4  for each row
  5  begin
  6    update test set a = :old.a + 1;
  7  end;
  8  /

Trigger created.

SQL> update test set a = 1;
update test set a = 1
       *
ERROR at line 1:
ORA-04091: table MCHS_TEST.TEST is mutating, trigger/function may not see it
ORA-06512: at "MCHS_TEST.TEST_ARU", line 2
ORA-04088: error during execution of trigger 'MCHS_TEST.TEST_ARU'


Или имелся в виду какой-то другой триггер? Статья полезная, разумеется.
:)
Имелся в виду такой же триггер, но объявленный как автономная транзакция.
Ну, с автономной транзакцией можно и самого себя задидлочить.
Этот момент стоит уточнить.
Ну есть и другие способы сделать рекурсию: в триггере на одну таблицу можно апдейтить другую, а в триггере на ту таблицу апдейтить первую.
Об этом подробнее говорится (с примером) в видео-версии статьи.
И запрос на триггер After Commit висит с 98-го года если не ошибаюсь. Это так, жизнь-боль :)
:)
«жизнь-боль» — это самый популярный мем в нашей команде

Скажите, планируется ли написать такую же статью «Всё о материализованных представлениях»?
Sign up to leave a comment.

Articles