想实现一个触发器,在表LGT_RY_NB插入一条数据前,判断这条数据的SFZH是否like'%111111%' 如果是的话,把这条数据插入到LGT_RY_NB_BackUp表中,然后从LGT_RY_NB中根据ZJHM这个主键删除这条记录(或者禁止执行插入操作),否则的话不做任何操作。就是判断一条数据的SFZH字段是否like 111111 是的话不让其插入数据库
create or replace trigger TRG_ChoseData After INSERT 
ON LGT_RY_NB FOR EACH ROW
DECLARE
    
    FOUND            BOOLEAN;
   BEGIN
    
     IF :New.ZJHM Like '%1111111%'
      Then 
      Delete From LGT_RY_NB Where ZKLSH=:new.zklsh;
      Insert Into LGT_RY_NB_BackUp (ZKLSH,XM,SFZH) Values (:new.ZKLSH,:new.XM,:new.SFZH);
    
    END IF;--  ERRORS HANDLING
EXCEPTION
    WHEN INTEGRITY_ERROR THEN
       RAISE_APPLICATION_ERROR(ERRNO, ERRMSG);
END;我的问题是如果Before INSERT  ON LGT_RY_NB FOR EACH ROW 此时执行Delete From LGT_RY_NB Where ZKLSH=:new.zklsh;没有意义,因为这时候还没插入数据,可是如果After INSERT  ON LGT_RY_NB FOR EACH ROW  又不能用 ;new 提取主键 

解决方案 »

  1.   

    行级AFTER触发器也是可以用到:New的,但是不能执行删除操作。可以新建一个字段flag,然后分别建一个before行级触发器和一个 after表级触发器。行级触发器中插入数据到备份表,且将要删除的记录的FLAG标记为1,在表级触发器里执行删除操作
      

  2.   

    重复发帖已经说过了,建个视图,利用视图的替代触发器(instead of)实现功能。--给你的LGT_RY_NB表建一个view,利用这个view插入数据,目的是使用instead of触发器。
    create or replace view LGT_RY_NB_VIEW
    as select * from LGT_RY_NB;--触发器建到这个view上,建一个instead of触发器
    create or repace trigger LGT_RY_NB_VIEW_TRIGGER
    instead of insert on LGT_RY_NB_VIEW
    begin
        if :New.ZJHM Like '%1111111%' then
            Delete From LGT_RY_NB Where ZKLSH=:new.zklsh; 
            Insert Into LGT_RY_NB_BackUp (ZKLSH,XM,SFZH) 
            Values (:new.ZKLSH,:new.XM,:new.SFZH); 
        else
            insert into LGT_RY_NB values(:new.ZKLSH,:new.XM,:new.SFZH);
        end if;
    end;
    /