Ошибка триггера таблицы преобразования для одного типа оператора вставки - PullRequest
0 голосов
/ 26 апреля 2019

Я получаю ошибка изменяющейся таблицы для оператора insert into employee select 'xyz',200 from dual, и сценарии успешно выполняются для insert into employee values ('abc',100);.

Может кто-нибудь объяснить, почему оператор не выполняется для одного типа оператора вставки?Оба сценария вставляют данные одинакового типа в таблицу

детали сценария:

--table creation
create table employee (name varchar2(30),salary number);

--trigger creation
create or replace trigger emp_trig 
before insert on employee
for each row
begin
delete from employee where name=:new.name;
end;
/
--insert statement 1
insert into employee values ('abc',100);
--result : 1 row inserted

--insert statement 2
insert into employee select 'xyz',200 from dual
--result: 

Error report -
ORA-04091: table NMS_CON.EMPLOYEE is mutating, trigger/function may not see it
ORA-06512: at "NMS_CON.EMP_TRIG", line 2
ORA-04088: error during execution of trigger 'NMS_CON.EMP_TRIG'

1 Ответ

0 голосов
/ 26 апреля 2019

Вставка одной строки не приведет к ошибке таблицы мутаций - как это может быть, поскольку этой строки раньше не было?

Но метод insert-select потенциально может включать более одной строки, так что вы получитеошибка.

Как правило, в триггере не должно быть операций DML без запроса.Слишком много возможных побочных эффектов и нежелательных последствий.

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

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

Надеюсь, это поможет!

...