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

本文探讨了在数据库中使用触发器时遇到的问题,特别是当触发器运行导致表锁定,无法进行查询的情况。介绍了如何利用自治事务来解决这一问题,确保在删除数据前能获取到相关联表的信息,并记录到日志表中,避免数据完整性受损。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:https://blog.youkuaiyun.com/pan_tian/article/details/7675800

参考:https://blog.youkuaiyun.com/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表数据的情况,否则将向日志表中插入一条错误日志记录

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值