Исключение из таблицы мутаций не происходит - PullRequest
0 голосов
/ 06 сентября 2018

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

drop table temp;
create table temp (id number,name varchar2(500),is_active number);

create or replace trigger temp_trg before insert  on temp
for each row
declare 
v_count number;
begin
 select count(1) into v_count from temp;
 update temp set is_active=0 where is_active=1 and id=:new.id;
end;
/

select * from temp;

insert into temp values (1,'xyz',1);
insert into temp values (1,'xyz',1);
insert into temp select 1,'xyz',1 from dual;

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Ограничение на таблицы мутаций распространяется на все триггеры, которые используют условие FOR EACH ROW, за исключением случаев, когда выполняется одно из следующих условий:

  • триггер срабатывает при событии BEFORE, т.е. данные фактически не изменились
  • известно, что будет затронута только одна строка - INSERT ... VALUES является единственным DML, который удовлетворяет этому условию
0 голосов
/ 06 сентября 2018

получение ошибки при вставке с использованием запроса.

Мутирование таблицы происходит, когда мы запрашиваем таблицу, которой принадлежит триггер. В частности, это происходит, когда Oracle не может гарантировать результат запроса. Теперь, когда вы вставляете одну строку в таблицу, Oracle может предсказать результат запроса при срабатывании триггера FOR EACH ROW, потому что это одна строка.

Но с запросом INSERT FROM Oracle запутывается: должен ли счет быть конечным числом, включающим все строки, выбранные запросом, или просто скользящий счет? В этом случае ответ кажется простым, но легко представить другие запросы, где ответ не является четким. Вместо того чтобы оценивать каждый запрос на его предсказуемость, Oracle применяет простой указ и отбрасывает ORA-04091 для всех вставок, управляемых запросами.

...