【问题标题】:Creating an UPDATE trigger that causes the removal of the triggering row创建导致删除触发行的 UPDATE 触发器
【发布时间】:2012-04-22 17:59:33
【问题描述】:

我使用的是 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 时,我需要删除调查表中的一行(因为删除了引用的行)。

触发器编译没有问题,但是当条件触发时,我得到这个错误:

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

实际上,我知道我正在编辑触发触发器的同一个表。但是我想取消更新,或者完成它,我不在乎,然后删除那一行

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

【问题讨论】:

  • 可能是语句执行了触发器或 PL/SQL 函数。该触发器/函数试图修改或查询当前正在由触发触发器/函数的语句修改的表。请检查techonthenet.com/oracle/errors/ora04091.php
  • @user1127214:是的,这就是重点:)

标签: oracle


【解决方案1】:

您可以像这样使用语句级触发器:

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;

【讨论】:

  • +1。但是,如果表很大,这可能会给表上的每次更新带来严重的性能问题……这可能会通过合适的基于函数的索引来缓解。
猜你喜欢
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2016-02-13
  • 1970-01-01
  • 2016-11-11
  • 2019-09-12
相关资源
最近更新 更多