Ошибка при попытке удалит строку - 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 шт):
Нельзя в построчном триггере обращаться к таблице, которая изменяется.
Но собственно, обращаться к ней и не нужно:
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 находится в процессе изменения (мутирует), триггер/функция может не увидеть эти изменения.