PL/SQL 触发器更新或删除

Posted

技术标签:

【中文标题】PL/SQL 触发器更新或删除【英文标题】:PL/SQL Trigger Update or Delete 【发布时间】:2014-03-09 23:12:37 【问题描述】:

我有两张表,它们的输出如下所示:

Project Table
CODE         NAME                           
------------ -------------- 
101          Alpha                       
222          Beta                       
355          Gamma                       
973          Delta                   

Assignment Table
ID    NAME         PROJCODE       HOURS              
----- ------------ -------------- ------------ 
55055 Smith        101            20                     
55055 Smith        222            10                     
39002 Hammond      973            25                     
00001 Preston      355            5                      
10000 Logan        355            5                      
00777 Bond         222            20                        

如果分配表中项目的最后一个人被更新/删除(因此项目代码没有分配给它的人),我想将其从项目表中删除。我想将它输出到 DBMS_OUTPUT。我编写了以下触发器,但每次尝试测试触发器时都会出错。

CREATE OR REPLACE TRIGGER project_removal_trigger AFTER
  DELETE OR
  UPDATE ON ASSIGNMENT FOR EACH ROW DECLARE PRINT project.code%type;
  BEGIN
    DELETE
    FROM PROJECT
    WHERE code NOT IN
      (SELECT Projcode FROM assignment GROUP BY projcode HAVING COUNT(name) > 0
      );
  END;

我做错了什么?

【问题讨论】:

到底是什么错误? 错误报告 - SQL 错误:ORA-04091:表 ASSIGNMENT 正在变异,触发器/函数可能看不到它 ORA-06512:在“PROJECT_REMOVAL_TRIGGER”,第 2 行 ORA-04088:触发器执行期间出错'PROJECT_REMOVAL_TRIGGER' 04091. 00000 - “表 %s.%s 正在变异,触发器/函数可能看不到它” *原因:触发器(或此语句中引用的用户定义的 plsql 函数)试图查看(或modify) 正在被触发它的语句修改的表。 *操作:重写触发器(或函数),使其不读取该表。 项目表上是否有任何触发器试图对分配表进行任何更改? 【参考方案1】:

触发器无法从触发它的表中进行选择。否则你会得到 ORA-04091: table XXXX is mutating, trigger/function may not see it。尽量不要在触发器中加入太多逻辑。

【讨论】:

以上是关于PL/SQL 触发器更新或删除的主要内容,如果未能解决你的问题,请参考以下文章

更新同一表中的值的 PL/SQL 插入和删除触发器

PL / SQL触发器在更新或插入后更新同一个表

pl/sql 触发器完整性约束问题

PL/SQL 触发器和多次更新

如何创建在 PL/SQL 中更新后触发的触发器

使用 PL/SQL 块创建触发器时出错