我创建了一个删除前触发器:
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'时发生错误
答案 0 :(得分:1)
您可能更喜欢使用set null
选项添加外键约束,而不是这样的触发器。当然,您需要在emp_id
列上定义主键:
alter table emp
add constraint fk_mgr foreign key(mgr)
references emp(emp_id)
on delete set null;
每当您删除带有emp_id
列且具有匹配值的mgr
记录时,在删除带有该emp_id
的记录后,这些记录将被清空。
但请更喜欢
mgr
符合列的数据类型(数字)emp_id
(例如integer
)可以定义外键 约束。
顺便说一句
emp_name
列进行过滤,因为
可以有一个以上具有相同名称的人,但是使用emp_id
到目前为止,在表中具有唯一性会更好。