goods货物表,字段id主键,price价格,counts销售数量,saler 是否是热销商品
trade交易记录表,字段id主键,g_id货物标识。现在往trade表中插入一条数据,则会更新goods表中对应g_id的id的counts,
SQL>  create trigger dele_insert
  2   after insert or update on trade
  3   for each row
  4   begin
  5   if inserting then
  6   update goods set counts=(counts+1) where id=:old.g_id;
  7   elsif deleting then
  8   update goods set counts=(counts-1) where id=:old.g_id;
  9   end if;
 10   end;
 11   /现在想实现如果goods 对应的counts>30,则自动更新saler为1,标识热销商品。
自己写的触发器为:
 create trigger  upsaler
 after update on goods
 for each row
 begin
 case
 when updating('counts') then
 if :new.counts>10
 then 
 update goods set saler='1' where :new.id=:old.id;
 end if;
 end case;
 end;
 /
但是往trade插入数据时,抛出异常
第 1 行出现错误:
ORA-04091: 表 SYSTEM.GOODS 发生了变化, 触发器/函数不能读它
ORA-06512: 在 "SYSTEM.UPSALER", line 6
ORA-04088: 触发器 'SYSTEM.UPSALER' 执行过程中出错
ORA-06512: 在 "SYSTEM.G_T", line 2
ORA-04088: 触发器 'SYSTEM.G_T' 执行过程中出错
ORA-06512: 在 line 5
求解,求正确的触发器写法,谢谢

解决方案 »

  1.   

    --我把你的触发器拿来编译了 编译成功。。
    --我建了一张goods表
    create table goods
     (
     id varchar2(10),
     counts number,
     saler varchar2(10)
     )
    --估计你使用的表结构产生了变化
    --你检查下你的表中这三个字段是否都还在
    --然后根据你的错误信息你的表是在system用户下
    --如果你用的其他用户登陆操作不了这些表
      

  2.   


    --有上面的表的情况下,下面这个触发器 编译是不会报错的,也就是你写的一模一样
    create trigger upsaler
     after update on goods
     for each row
     begin
     case
     when updating('counts') then
     if :new.counts>10
     then  
     update goods set saler='1' where :new.id=:old.id;
     end if;
     end case;
     end;
     
      

  3.   

    往trade插入数据时,抛出异常,插入数据的时候,触发器报错
      

  4.   

    编译是没问题的

    update goods set saler='1' where :new.id=:old.id;
    改成
    select '1' into :N.saler from dual;
    就ok了
      

  5.   

    --问题不在这里 我插入值到trade里面也没有问题
      

  6.   


    怎么跟 表结构没关系。。
    你trigger里面 update 表 set 列=值
    如果你这个表里面没得这个列 你怎么操作。如果你当前用户对你trigger里面操作的表没得修改权限你怎么操作?
      

  7.   

    权限应该是够的,而且其他的触发器可以更新,但是就是这个触发器更新不了,
    这个触发器是可以更新的 create trigger dele_insert
     after insert or delete  on trade 
     for each row
     begin
     if inserting then 
     update goods set counts=(counts+1) where id=:old.g_id;
     elsif deleting then
     update goods set counts=(counts-1) where id=:old.g_id;
     end if;
     end;
     /,
    所以我怀疑我的触发器写的不对,