A表
create table AA
(
  AA_ID NUMBER not null,
  SEX   VARCHAR2(10)
)
AA_Backup(AA表的备份表)
create table AA_Backup
(
  AA_ID NUMBER not null,
  SEX   VARCHAR2(10)
)
我的触发器的目的是判断AA表的记录数如果大于3条记录
就复制表数据到AA_Backup 然后删除AA表那3条记录以下是我的代码 但我不明白为什么我只能用before 而不能用after(事件发生之前或之后激活触发器)create or replace trigger trigger_aa
before INSERT ON aa
for each row
declare
count_num number;BEGIN
select count(*) into count_num from aa;
If count_num>3
THEN
insert into AA_backup(sex) select sex from (select sex from aa  order by AA_ID asc) aa where  rownum<=3;
delete from aa where rownum<=3;
END IF;
END trigger_aa;以上代码可以使用 但我想搞明白 如果用after怎么写 万分感谢!

解决方案 »

  1.   

    inserting   操作   :new  只有before才有:new,after就没有:new了
    update   操作   :new,:old   ,如果更新某个字段触发使用if   updating( 'col ')   then   ...... 
    delete   操作   :old 
      

  2.   


    因为after触发器是不能在触发体中再对你触发表aa进行select查询的,
    只有before 触发器才能。
    因为你触发体中要判断触发表中笔数,不能用after触发器
    BEFORE 和after 只是一个触发时机的问题,你可以详细看看Oracle触发器,我个人资源里有两个PDF文章,你可以去下载看看
      

  3.   

    难道与偶那个 after 就不能  count(*)  查询aa表有别的解决方式吗 在下新手
      

  4.   

    问题原因就如2楼说的
    你的最终目的是什么  是把AA表的数据备份吧
    在这里用before或是after 对你很大影响么
      

  5.   

    要么就去掉  for each row
      

  6.   

    ---改成语句级的触发器
    create or replace trigger trigger_aa after INSERT ON aadeclare
    count_num number;BEGIN
    select count(*) into count_num from aa;
    If count_num>3
    THEN
    insert into AA_backup(sex,AA_ID) select sex,AA_ID from (select sex,AA_ID from aa order by AA_ID asc) aa where rownum<=3;
    delete from aa where rownum<=3;
    END IF;
    END trigger_aa;
    ---你的备份表的AA_ID不能为空 的补上AA_ID
    insert into AA_backup(sex,AA_ID) select sex,AA_ID from (select sex,AA_ID from aa order by AA_ID asc) aa where rownum<=3;