我随手建了个触发器,目的是想熟悉一下触发器,但是建了后,发现只要将触发器设置成有效,触发器中所涉及到的相关的表就无法做修改....请各位高手指点迷津....谢谢大家
具体语句:
需要实现功能是TBL这个表只要有任何数据的修改,就会将其中一个栏位的数量进行修改,现在迷惑的是为什么会锁表....CREATE OR REPLACE TRIGGER TESTBEFORE UPDATEOF QTYON TESTDB.TBLREFERENCING NEW AS NEW OLD AS OLDFOR EACH ROWBEGIN   update TESTDB.TBL set qty='99999999' where materialno='UT0002-D01';END test;/

解决方案 »

  1.   

    在TRIGGER中不能将TRIGGER所基于的表进行DML语句操作. 你的写法有多处问题:1. BEFORE UPDATE OF QTY 意味着只有当QTY列被修改时,触发器才触发. 那你的TRIGGER内容又要去修改QTY, 逻辑错误
    2. 如果你是修改本表TBL的QTY字段,你可以用的是 :NEW.QTY='9999999'; 当然你可以写成
       if :old.materialno='UT0002-D01' then 
         :NEW.QTY='9999999';
       end if;
       但那样只有在你主UPDATE语句中所涉及的记录才会应用以上代码.
    3. 以上TRIGGER只有当ON TESTDB.TBL与update TESTDB.TBL set中的表不同时才有意义. 触发器内部不允许DML当前表. 对当前表的操作应用:OLD.或:NEW.来引用。