触发器问题--ora-04091错误,请教

dotnba 2004-04-27 02:46:01
这是一个主从关系的两个表,但是当删除主表记录时,导致ora-04091。
原因是因为在删除子表的时候,导致主表的COPY变化,从而导致ora-04091错误,请问如何主表触发器应该怎么写?并能达到数据完整和一致。

--表EDOCS插入触发器
CREATE OR REPLACE TRIGGER trInsEDOCS
BEFORE INSERT ON EDOCS
FOR EACH ROW
BEGIN
--计数器加1
Update JKARCHVOL21 Set COPY = NVL(COPY,0) + 1
Where VOL_ID = :NEW.VOL_ID;
END trInsEDOCS;
--表EDOCS删除触发器
CREATE OR REPLACE TRIGGER trDelEDOCS
BEFORE DELETE ON EDOCS
FOR EACH ROW
BEGIN
--计数器减1
Update JKARCHVOL21 Set COPY = NVL(COPY,0) - 1
Where VOL_ID = :OLD.VOL_ID;
END trDelEDOCS;
--表JKARCHVOL21删除触发器
CREATE OR REPLACE TRIGGER trDelArch
BEFORE DELETE ON JKARCHVOL21
FOR EACH ROW
BEGIN
--保证数据完整性
Delete From Edocs Where VOL_ID = :OLD.VOL_ID;
END trDelArch;
...全文
256 点赞 收藏 6
写回复
6 条回复
ZHANGGANGG 2004年05月09日
你的表EDOCS和表JKARCHVOL21之间似乎并不是主从表的关系啊
你把触发器
CREATE OR REPLACE TRIGGER trDelArch
BEFORE DELETE ON JKARCHVOL21
FOR EACH ROW
BEGIN
--保证数据完整性
Delete From Edocs Where VOL_ID = :OLD.VOL_ID;
END trDelArch;
该成 after 类型的试一试
回复 点赞
ZHANGGANGG 2004年05月09日
表EDOCS和表JKARCHVOL21做一个级联(on delete cascade)
回复 点赞
welyngj 2004年05月09日
CREATE OR REPLACE TRIGGER trDelArch
BEFORE DELETE ON JKARCHVOL21
FOR EACH ROW
BEGIN
--保证数据完整性
Delete From Edocs Where VOL_ID = :OLD.VOL_ID;
END trDelArch;


可以用级联删除来解决。
回复 点赞
dotnba 2004年05月09日
大家是怎么样解决这样地问题地?
回复 点赞
ern 2004年04月27日
ORA-04091 table string.string is mutating, trigger/function may not see it


Cause: A trigger (or a user defined PL/SQL function that is referenced in this statement) attempted to look at (or modify) a table that was in the middle of being modified by the statement which fired it.

Action: Rewrite the trigger (or function) so it does not read that table.
回复 点赞
bobjeey 2004年04月27日
1
回复 点赞
发动态
发帖子
基础和管理
创建于2007-09-28

7175

社区成员

9.5w+

社区内容

Oracle 基础和管理
社区公告
暂无公告