为什么创建触发器是会报错:
ORA-04098: 触发器 'DB0.SS' 无效且未通过重新确认

解决方案 »

  1.   

    帮忙看看下面的代码有什么错?谢谢!给分!CREATE OR REPLACE TRIGGER DBO.AA
    AFTER  DELETE 
    ON DBO.AA
    FOR EACH ROW 
    begin
       insert into AA_BAK values(:old.aa1,:old.aa2);
    end;
      

  2.   

    不行啊,楼上
    我改了触发器名字,还是不行呀,用SQLPLUS创建警告有编译错误
      

  3.   

    CREATE OR REPLACE TRIGGER DBO.AA--修改触发器名
    AFTER  DELETE 
    ON DBO.AA
    FOR EACH ROW 
    begin
       insert into AA_BAK values(:old.aa1,:old.aa2);--指明要插入字段
    end;
      

  4.   

    创建成功,但是删除数据时报错!
    ORA-04098: 触发器 'GJPT.TRI_AA' 无效且未通过重新确认
      

  5.   

    你建立后提交了吗?
    commit;
      

  6.   

    SQL> CREATE OR REPLACE TRIGGER gjpt.TRI_AA
      2  AFTER  DELETE
      3  ON gjpt.AA
      4  FOR EACH ROW
      5  begin
      6     insert into AA_BAK (a1) values(:old.a1);
      7  end gjpt.TRI_AA;
      8  /警告: 创建的触发器带有编译错误。SQL> select * from aa;A1
    --------------------
    3
    2
    1SQL> select * from aa_bak;未选定行SQL> delete from aa;
    delete from aa
                *
    ERROR 位于第 1 行:
    ORA-04098: 触发器 'GJPT.TRI_AA' 无效且未通过重新确认这是我的操作过程,大家看看吧!写了!一定给分!
      

  7.   

    SQLWKS> create table aa(
         2> wgtest1 varchar2(12),
         3> wgtest2 varchar2(32)
         4> );
    语句已处理。
    SQLWKS> commit;
    语句已处理。
    SQLWKS> CREATE OR REPLACE TRIGGER trig_aa
         2> AFTER  DELETE
         3> ON aa
         4> FOR EACH ROW
         5> begin
         6>     insert into aa(wgtest1,wgtest2) values(:old.wgtest1,:old.wgtest2);
         7> end;
         8> 
    语句已处理。
    SQLWKS> commit;
    语句已处理。
    SQLWKS> select * from aa;
    WGTEST1      WGTEST2                         
    ------------ --------------------------------
    已选择0行。
    SQLWKS> delete from aa;
    己处理0行。其实你要注意的是,你对同一个表操作,你的表如果有结果你将看到:
    SQLWKS> insert into aa values('aa','bb');
    处理了 1 行。
    SQLWKS> commit;
    语句已处理。
    SQLWKS> delete  from aa;
    ORA-04091: 表JXYS.AA发生了变化,触发器/函数不能读
    ORA-06512: 在"JXYS.TRIG_AA", line 2
    ORA-04088: 触发器'JXYS.TRIG_AA'执行过程中出错
      

  8.   

    当我们用另外的触发器就可以看到:
    SQLWKS> CREATE OR REPLACE TRIGGER trig_aa
         2> AFTER  DELETE
         3> ON aa
         4> FOR EACH ROW
         5> begin
         6> insert into bb(wgbbtest1,wgbbtest2) values(:old.wgtest1,:old.wgtest2);
         7> end;
         8> 
    语句已处理。
    SQLWKS> commit;
    语句已处理。
    SQLWKS> delete from aa;
    处理了 1 行。
    SQLWKS> select * from bb;
    WGBBTEST1    WGBBTEST2                       
    ------------ --------------------------------
    aa           bb                              
    已选择 1 行。
    我们的结果表bb中已经有数据了!
      

  9.   

    SQL> CREATE OR REPLACE TRIGGER gjpt.TRI_AA
      2  AFTER  DELETE
      3  ON gjpt.AA
      4  FOR EACH ROW
      5  begin
      6     insert into AA_BAK (a1) values(:old.a1);
      7  end gjpt.TRI_AA;
      8  /警告: 创建的触发器带有编译错误。SQL> select * from aa;A1
    --------------------
    3
    2
    1SQL> select * from aa_bak;未选定行SQL> delete from aa;
    delete from aa
                *
    ERROR 位于第 1 行:
    ORA-04098: 触发器 'GJPT.TRI_AA' 无效且未通过重新确认这是我的操作过程,大家看看吧!写了!一定给分!这个在我这里执行没有任何错误出现我觉得问题处在:
    1、当前的用户是不是gjpt
    2、当前用户的权限?你在创建完TRIGGER出错后,应该用SHOW ERROR显示一下错误信息,这样才能帮你分析原因
      

  10.   

    After 好像不支持 行级触发器 所以应该使用 Befor 级触发器
      

  11.   

    在行级别后delete触发器,可能:old为null了,可以测试一下:
    create trigger a_tri
    after delete on a
    for each row
    begin
    if :old.id is null then
    insert into b values('1');
    end if;
    end;
    /
    这样查看b表中是否存在1的值,就知道事实
    建义把after改成before
      

  12.   

    下面的这一句不要FOR EACH ROW