【发布时间】:2020-03-12 22:57:37
【问题描述】:
我创建了一个删除前触发器:
create or replace trigger myTrigger3
before delete on emp
for each row
begin
update emp set mgr = 'Null' where mgr = :old.emp_name;
end;
桌子在哪里
emp(emp_id integer primary key, emp_name varchar(20), mgr varchar(20))
但是当我运行这个语句时,触发器没有运行。
delete from emp where emp_id = 1004;
select * from emp;
错误报告 -
ORA-04091:表 DB20178004.EMP 正在变异,触发器/函数可能看不到它
ORA-06512:在“DB20178004.MYTRIGGER3”,第 2 行
ORA-04088: 执行触发器 'DB20178004.MYTRIGGER3' 期间出错
【问题讨论】:
-
当表的数据已经发生变化时,您不能操作表数据。您必须在删除语句后 更新表。一种方法是不带
for each row的删除后触发器,您可以在其中更新所有不再在表中找到的经理。另一种是使用复合触发器,您可以记住after each row部分中所有已删除的 ID,并在after statement部分中使用它们进行更新。 -
附注:
set mgr = 'Null'可能应该是set mgr = null。您真的不想将 mgr 设置为包含单词“Null”的字符串,是吗?
标签: oracle plsql ddl database-trigger dml