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 触发器更新或删除的主要内容,如果未能解决你的问题,请参考以下文章