创建一个导致删除触发行的UPDATE触发器

时间:2012-04-10 12:31:32

标签: oracle

我使用的是Oracle Express 11g。我正在尝试创建此触发器:

CREATE TRIGGER remove_useless_surveys 
     BEFORE UPDATE OF agent_id, agency_id, province_id ON surveys 
     FOR EACH ROW WHEN (
     new.agent_id IS NULL AND 
     new.agency_id IS NULL AND
     new.province_id IS NULL)
DELETE FROM surveys WHERE survey_code = :new.survey_code

agent_id,agency_id和province_id是外键,带有ON DELETE SET NULL子句。

当所有三个外键都设置为NULL时,我需要在调查表中有一行是DELETED(因为删除了引用的行)。

触发器编译没有任何问题,但是当条件触发时,我收到此错误:

  

SQL错误:ORA-04091:表REALESTATE.SURVEYS正在变异,
  触发/功能可能看不到ORA-06512:在   “REALESTATE.REMOVE_USELESS_SURVEYS”,第1行ORA-04088:期间出错   执行触发'REALESTATE.REMOVE_USELESS_SURVEYS'   04091. 00000 - “表%s。%s正在变异,触发/功能可能看不到它”
  *原因:触发器(或用户定义的plsql函数,在              这句话)试图查看(或修改)一个表格              在被解雇它的声明修改的中间   *操作:重写触发器(或函数),使其不读取该表。

实际上,我知道我正在编辑触发触发器的同一个表。但我想取消更新,或者最终确定,我不在乎,然后删除该行

你能帮帮我吗?我怎样才能实现我想要做的事情?

1 个答案:

答案 0 :(得分:3)

你可以使用这样的语句级别触发器:

CREATE TRIGGER remove_useless_surveys 
AFTER UPDATE OF agent_id, agency_id, province_id ON surveys 
BEGIN
  DELETE FROM surveys 
  WHERE  agent_id IS NULL 
  AND    agency_id IS NULL
  AND    province_id IS NULL;
END;