日期:2014-05-17  浏览次数:20802 次

oracle 创建一个简单触发器,为什么达不到效果。
本帖最后由 QQ81867376 于 2012-11-02 15:35:20 编辑
修改某条数据的时候,如果修改的是ID列,在修改该ID的值时候,去查询该表中parent_id的值,如等于修改前的值 ,则也修改成新值。 一句话,就是让 id和parent_id同步。如下是我写的触发器。

--建立触发器  修改预算单位ID的时候 同时修改以该ID为父节点的parent_id
---2
create or replace trigger tr_changeID
  before update on  gap_ele_agency
  for each row
begin
  if updating('id') then
     update gap_ele_agency set gap_ele_agency.parent_id = :new.id where gap_ele_agency.parent_id= :old.id ;
  end if;
end;

举例说明:

select * from gap_ele_agency where id in (2797,2793);

结果如下表:



现在修改第一条数据。

update gap_ele_agency set id=2794 where id=2793;

要达到的效果是 第二条的parent_id为2794。

报错如下:



------解决方案--------------------
触发器中对本表的操作 可能会出现脏读或者逻辑死锁。

非要这么写加上自治事务,但是可能会造成逻辑错误。


------解决方案--------------------
ORACLE在触发器里不允许对本表进行DML操作,否则会影响数据完整性。