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

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操作,否则会影响数据完整性。

------其他解决方案--------------------
我发了半天的帖子没有人回答。不过怎么突然就好了呢?

create or replace trigger tr_changeID
  before update on gap_ele_agency
  for each row
declare
  agency_id NUMBER;
  some_kinds_of_err exception;
begin
  if updating('id') then  
    agency_id := :new.id;
    dbms_output.put_line(agency_id);
    update gap_ele_agency
       set gap_ele_agency.parent_id = :new.id
     where gap_ele_agency.parent_id = :old.id;
  end if;

exception
  WHEN OTHERS THEN
    dbms_output.put_line(agency_id);
end;
------其他解决方案--------------------
为什么又不行了呢 ?还是回到原来的错误了。