最近为了更新一个功能, 但是又不想动到原先功能的后台代码, 所以选择了触发器, 触发器我总共就写过4个而已, 我以前也很抵触触发器的.
oracle 的触发器有表触发器和行触发器, 我用的是行触发器, 并且在这个触发器中需要修改到其他行的数据(例如树结构数据, 子项目要修改父项目的状态), 写完触发器后, 编译没有错误, 但是在触发器执行后报了 "ORA-04091:表XX发生了变化,触发器/函数不能读它" 的错误.
具体就是建立在某个表上面的触发器是无法处理该表的数据的.
在google 后, 没有找到解决方法, 但是知道把数据保存到其他地方和自治事务这两种方法.
自己考虑以后, 有点思路: 表A 的after update 触发器-> 存数据到中间表B -> 建立表B 的after insert 触发器修改表A 的数据.
在做了一些尝试后, 终于克服了存在的问题, 实现了目标!!
具体实现思路: 表A 的after update 触发器 -> 存数据到中间表B(注意要把new 的关键数据保存) -> 建立表B 的after insert 触发器(加上自治事务, 查询表A 数据要把new 相关的记录排除, 再通过union 组合, 不然会读到脏数据, 对表A 进行操作)
处理方法粗糙, 暂时解决问题!!