触发器问题--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;
...全文
301 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
  • 打赏
  • 举报
回复
相关推荐
发帖
基础和管理

1.7w+

社区成员

Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
帖子事件
创建了帖子
2004-04-27 02:46
社区公告
暂无公告