当表record_daiban的COMPLATE_STATUTS字段变为1时,将修改的记录插入到另外一个日志表里。然后删除当前记录create or replace trigger trg_upd_daiban
    after update
    of COMPLATE_STATUTS
    ON record_daiban
    FOR EACH ROW
BEGIN
    if :new.COMPLATE_STATUTS=1 then
       insert into record_log
       SELECT * FROM record_daiban t
       where t.complate_statuts='1' and t.id=:new.id;       delete from record_daiban t where t.complate_statuts='1' and t.id=:new.id;
       
       end if;
END trg_upd_daiban;

解决方案 »

  1.   

    为啥一执行到insert或delete操作就出错啊
      

  2.   

    不能对本身进行select 操作
      

  3.   

    trigger中的自治事务
    pragma autonomous_transaction
      

  4.   

    修改成这样可以的:insert into record_log(id) values(:newid);
      

  5.   

    http://topic.csdn.net/u/20100520/18/8042f9e1-d972-405b-837d-50612b2ed9b5.html
      

  6.   

    触发器不能对同一一个表进行操作,因为触发器在同一个事物下工作。例如:你增、删、改table1的情况下,目前你对table1的事物还没提交。之后还要对table1表进行增、删、改操作是不可以的。
      

  7.   


    --搞个自治事务 PRAGMA AUTONOMOUS_TRANSACTION;create or replace trigger trg_upd_daiban
      after update
      of COMPLATE_STATUTS
      ON record_daiban
      FOR EACH ROW
    declare
    pragma autonomous_transaction;
    BEGIN
      if :new.COMPLATE_STATUTS=1 then
      insert into record_log
      SELECT * FROM record_daiban t
      where t.complate_statuts='1' and t.id=:new.id;  delete from record_daiban t where t.complate_statuts='1' and t.id=:new.id;
        
      end if;
    END trg_upd_daiban
      

  8.   

    trigger类型从after改成before。例子
    DROP TABLE test;
    CREATE TABLE test
    (a NUMBER(2));
    CREATE OR REPLACE TRIGGER TR_TEST
      BEFORE INSERT ON TEST
      FOR EACH ROW
    DECLARE
      -- local variables here   
     v_count NUMBER(2);
    BEGIN
      SELECT COUNT(*) INTO v_count FROM test WHERE a=:new.a;
      IF v_count>0 THEN
        DELETE FROM test WHERE a=:new.a;
      END IF;
    END TR_TEST;INSERT INTO test
    VALUES(1);
    INSERT INTO test
    VALUES(2);
    INSERT INTO test
    VALUES(1);
    SELECT * FROM test;
      

  9.   

    还加commit;
    正常的trigger加commit都报错
      

  10.   

    之所以after报错,我的理解是,trigger实际是附加到你的sql语句,两者共同构成一个transaction,在after类型的trigger里对本表进行删除操作,可能会删除本次插入数据,这就产生了逻辑上的矛盾,这个原子性的操作是要插入还是要删除。
      

  11.   

    多谢,看来我的知识比较老旧了。
    麻烦改下我的代码,我改了好久都不能正常insert
    trigger里的before改成after
      

  12.   

    before的时候是可以正常insert的
      

  13.   

    trigger中的自治事务
    pragma autonomous_transaction
      

  14.   

    搞明白了
    DROP TABLE test;
    CREATE TABLE test
    (a NUMBER(2));
    CREATE OR REPLACE TRIGGER TR_TEST
      AFTER INSERT ON TEST
      FOR EACH ROW
    DECLARE
     v_count NUMBER(2);
     pragma autonomous_transaction;
    BEGIN  SELECT COUNT(*) INTO v_count FROM test WHERE a=:new.a;
      IF v_count>0 THEN
      DELETE FROM test WHERE a=:new.a;
      END IF;  
      COMMIT;
    END TR_TEST;INSERT INTO test
    VALUES(1);
    INSERT INTO test
    VALUES(2);
    INSERT INTO test
    VALUES(1);