create table tp(x int check(x>0));
CREATE OR REPLACE TRIGGER PRM_OWNER_USER.TP_TRIGGER
BEFORE DELETE OR INSERT
ON PRM_OWNER_USER.TP 
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
begin
  if (inserting) then
    update tp set x=x+1;
  else
    update tp set x=x-1;
  end if;  end;insert into tp values(2);
insert into tp values(2);
insert into tp values(2);
commit;delete tp where x=2;
报错,为什么

解决方案 »

  1.   

    oracel  触发器里面不需要commit;
      

  2.   


    --在触发器里面是不允许操作本表的,解决办法增加自制事务
    CREATE OR REPLACE TRIGGER PRM_OWNER_USER.TP_TRIGGER
      BEFORE DELETE OR INSERT ON PRM_OWNER_USER.TP
      REFERENCING NEW AS NEW OLD AS OLD
      FOR EACH ROW
    DECLARE
      PRAGMA AUTONOMOUS_TRANSACTION; --这里
    BEGIN
      IF (INSERTING) THEN
        UPDATE TP SET X = X + 1;
      ELSE
        UPDATE TP SET X = X - 1;     --但是这里也是有问题的,delete x=2的数据,这里将x再-1会产生资源争用的。
                                          --delete语句先将x=2的数据锁定,update再来update就会报错。
      END IF;END;