Ошибка при попытке удалит строку - ORA-04091: таблица изменяется, триггер/функция может не заметить это

Есть две таблицы:

CREATE TABLE USER_INFO(
  ID VARCHAR2(36) PRIMARY KEY,
  NAME VARCHAR(50) NOT NULL);

CREATE TABLE USER_HISTORY(
  ID VARCHAR(36) PRIMARY KEY,
  NAME VARCHAR2(50));

INSERT INTO USER_INFO(ID, NAME) VALUES('111', 'VLAD');
INSERT INTO USER_INFO(ID, NAME) VALUES('222', 'ANNA');
INSERT INTO USER_INFO(ID, NAME) VALUES('333', 'VIKA');

Если удалить запись в таблице USER_INFO, то должен срабатывать триггер и запись должна вставится в USER_HISTORY.

Для этого был написан такой триггер:

SET SERVEROUTPUT ON;
CREATE OR REPLACE TRIGGER REMOME_TRIGGER AFTER DELETE ON USER_INFO FOR EACH ROW
DECLARE
  user_name VARCHAR2(50);
BEGIN 
     SELECT NAME INTO user_name FROM USER_INFO WHERE ID=:old.ID;
     DBMS_OUTPUT.PUT_LINE('user_name:');
END;
/

Ожидаю, что при удалении какой-нибудь стоки из таблицы USER_INFO этот триггер сработает, но при таком запросе:

DELETE FROM USER_INFO WHERE ID='222';

Получаю ошибку:

DELETE FROM USER_INFO WHERE ID='222'
Error report -
ORA-04091: таблица USER_INFO изменяется, триггер/функция может не заметить это
ORA-06512: на  "REMOME_TRIGGER", line 4
ORA-04088: ошибка во время выполнения триггера 'REMOME_TRIGGER'

Ответы (1 шт):

Автор решения: 0xdb

Нельзя в построчном триггере обращаться к таблице, которая изменяется.

Но собственно, обращаться к ней и не нужно:

CREATE OR REPLACE TRIGGER REMOME_TRIGGER AFTER DELETE ON USER_INFO FOR EACH ROW
BEGIN 
     insert into user_history values (:old.id, :old.name);  
END;
/

delete from user_info
/
3 rows deleted.

select * from user_history
/
ID       NAME    
-------- --------
111      VLAD    
222      ANNA    
333      VIKA    

PS в связанном вопросе подробнно обсуждались причины этой ошибки.

Более точный перевод текста ошибки:

ORA-04091: table XY is mutating, trigger/function may not see it

таблица XY находится в процессе изменения (мутирует), триггер/функция может не увидеть эти изменения.

→ Ссылка