有两个表:
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'
您无法访问在行触发器中正在修改的表。
但实际上,你不需要引用它:
PS相关问题详细讨论了这个错误的原因。
错误文本的更准确翻译:
XY 表正在修改(变异)过程中,触发器/函数可能看不到这些更改。