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;
------其他解决方案--------------------为什么又不行了呢 ?还是回到原来的错误了。