由于项目的原因,需要依靠程序批量生成一堆oracle触发器。目前这个程序开发完成,能够建立正确的触发器到指定数据库。
可是,用程序建立的触发器,总是需要在oracle数据库里重新生成一次,才能正常工作。
这是什么原因呢?请问高手,这种情况该如何解决。
新生成的触发器上,总有一个小叉,被触发的触发器报“ora-04098 触发器 无效且未通过重新确认”错误。
如下图:实际触发器并没用错误。只要重新编译一次就可以运行。
但由于数量很多,况且可能随时有修改,所以靠人工点击不太靠谱。
so ~~大家帮帮忙呀~另外,我使用的是oracle8i数据库

解决方案 »

  1.   

    图片的地址竟然是file:///d:/oracleError.bmp...
    看不到
      

  2.   

    传到csdn空间相册里再链接图片
      

  3.   

    是不是trigger里有语法错误呀,如果没有语法错误的话create trigger XXXX
    end;
    /用这样的方式,应该是可以compile一次的。或者是你后面有ddl语句。修改了trigger里依赖的表,所以需要重新compile
    如果是这样,也不要紧。在所有的语句后面,加上
    alter trigger XXXX compile;  在编译一次就可以叻。
      

  4.   

    程序批量生成的触发器,旁边都有一个小叉:打开其中一个:发现下面确实有报错信息,点击报错信息,高亮显示在:"DECLARE X NUMBER;"
    这里有错蛮??如果不管它,直接点运行:
    http://hi.csdn.net/space-20644-do-album-picid-422184.html
    就说编译成功,也可以正确执行。
    http://hi.csdn.net/space-20644-do-album-picid-422186.html
      

  5.   

    用命令compile一下,看有没哟什么题提示
      

  6.   

    用了,
    1、放在一个tigger所有语句后
    alter trigger XXXX compile; 不得行,会提示,alter不能放置在这个位置。
    2、新开一个sql窗口,运行,提示成功,但小叉还在,刷新后也没反应。
      

  7.   

    create or replace trigger DS_TR_T_ALL_COLUMN
      after insert on T_ALL_COLUMN  
      for each row declare X integer;(报错PLS-00103,高亮显示在这条语句)      BEGIN
          IF inserting then
             select count(S_TABLE_NAME) INTO X FROM T_TRANSDATALOG WHERE S_TABLE_NAME='T_ALL_COLUMN' AND S_PK1_VALUE =:NEW.TABLE_NAME AND S_PK2_VALUE =:NEW.COLUMN_NAME ;
             IF X>0 THEN
                UPDATE t_Transdatalog set data_flag=1,s_data_date=SYSDATE WHERE S_TABLE_NAME='T_ALL_COLUMN' AND S_PK1_VALUE =:NEW.TABLE_NAME AND S_PK2_VALUE =:NEW.COLUMN_NAME ;
             ELSE
                INSERT INTO T_TRANSDATALOG(S_TABLE_NAME,S_PK1,S_PK1_VALUE,S_PK2,S_PK2_VALUE,DATA_FLAG,S_DATA_DATE,D_TABLE_NAME,OILSTORE_ID)VALUES('T_ALL_COLUMN','TABLE_NAME',:NEW.TABLE_NAME,'COLUMN_NAME',:NEW.COLUMN_NAME,0,SYSDATE,'T_ALL_COLUMN',2);
             END IF;
          END IF;
    end DS_TR_T_ALL_COLUMN ;