删除前触发

时间:2019-11-17 11:15:13

标签: oracle plsql ddl database-trigger dml

我创建了一个删除前触发器:

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'时发生错误

1 个答案:

答案 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)可以定义外键   约束。

Demo

顺便说一句

  • 我建议您使用软删除。例如在表中添加活动列,并 想要删除时将其值设置为零,并且不显示 记录在应用程序上的active = 0。
  • 如果您坚持要删除,请不要按emp_name列进行过滤,因为 可以有一个以上具有相同名称的人,但是使用emp_id 到目前为止,在表中具有唯一性会更好。