Oracle触发器出发时报错:ORA-04091: 表 **发生了变化, 触发器/函数不能读它

参考:https://blog.csdn.net/pan_tian/article/details/7675800

参考:https://blog.csdn.net/hong10086/article/details/69666863

错误原因:触发器建立在表上时,当被触发时,表被锁定,不能用于查询。

解决办法:

1、考虑是否可通过表的关联获取到想要的其他信息(其他表中),通过 :OLD.XXID 外键关联获取

2、使用 

PRAGMA AUTONOMOUS_TRANSACTION  自治事务,并按情况进行 commit 或 rollback

需要注意以下几点

第一,这段程序不依赖于原有Main程序,比如Main程序中有未提交的数据,那么在自治事务中是查找不到的。

比如主程序中删除一些记录,但尚未提交事务时,自治事务仍可查到相应数据记录

 

第二,在自治事务中,commit或者rollback只会提交或回滚当前自治事务中的DML,不会影响到Main程序中的DML。

第三,自治事务有可能破坏数据完整性

 

本次使用场景:

A表主键作为B表外键,而触发器在处理删除数据时,需要获取B表中的信息录入到日志表中。

若要删除A中数据需先将B中数据删除,否则会与外键约束冲突

使用自制事务可以获取在主程序外获取到已删除的B表信息

问题:需保证程序中的删除正确,不会出现直接删除A表数据的情况,否则将向日志表中插入一条错误日志记录

 

 

 

你可能感兴趣的:(Oracle触发器出发时报错:ORA-04091: 表 **发生了变化, 触发器/函数不能读它)