暂无图片
在Oracle 表A中创建了一个After Insert Trigger for each row触发器,如何能在这个触发器中再向A表插入记录?
我来答
分享
若水
2022-01-11
在Oracle 表A中创建了一个After Insert Trigger for each row触发器,如何能在这个触发器中再向A表插入记录?

在Oracle 表A中创建了一个After Insert Trigger for each row触发器,如何能在这个触发器中再向A表插入记录?

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
沈克伟

原因:
在Oracle中执行DML语句的时候是需要显示进行提交操作的。当我们进行插入的时候,会触发触发器执行对触发器作用表和扩展表的种种操作,但是这个时候触发器和插入语句是在同一个事务管理中的,因此在插入语句没有被提交的情况下,我们无法对触发器作用表进行其他额外的操作。如果执行其他额外的操作则会抛出如上异常信息。


解决方案:
出错的原因是因为触发器和DML语句在同一事务管理中,所以方案一便是将触发器和DML语句分成两个单独的事务处理。这里可以使用Pragma autonomous_transaction; 告诉Oracle触发器是自定义事务处理。

暂无图片 评论
暂无图片 有用 0
打赏 0
Thomas

after insert触发器里,访问被触发表,或者DML被触发表,均会报错ORA-04091。首先,你这个业务逻辑,不会是每增加一条记录,就立马再往同样表里INSERT一条吧?应该是有个判断,比如if :new.字段='xx' then insert into...,即当满足某个条件时,才需要再往原表加记录。 建议,不用after insert trigger,而改用before insert for each row trigger, 应该就不会报错了。但使用时,仍有需要注意的,用INSERT VALUES ...不会报错,但如果用INSERT SELECT,哪怕只INSERT一条记录,也会报错ORA-04091。

暂无图片 评论
暂无图片 有用 0
打赏 0
DarkAthena

除了用自治事务外,你还得加条件让它不会一直插。可以用特定字段的值或者全局变量来控制

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏