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