oracle 创建一个简单触发器,为什么达不到效果。

言多必失 2012-11-02 03:32:05
修改某条数据的时候,如果修改的是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。

报错如下:


...全文
85 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yf520gn 2012-11-02
  • 打赏
  • 举报
回复
ORACLE在触发器里不允许对本表进行DML操作,否则会影响数据完整性。
forgetsam 2012-11-02
  • 打赏
  • 举报
回复
触发器中对本表的操作 可能会出现脏读或者逻辑死锁。

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

言多必失 2012-11-02
  • 打赏
  • 举报
回复
为什么又不行了呢 ?还是回到原来的错误了。
言多必失 2012-11-02
  • 打赏
  • 举报
回复
我发了半天的帖子没有人回答。不过怎么突然就好了呢?

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;

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧