由于项目的原因,需要依靠程序批量生成一堆oracle触发器。目前这个程序开发完成,能够建立正确的触发器到指定数据库。
可是,用程序建立的触发器,总是需要在oracle数据库里重新生成一次,才能正常工作。
这是什么原因呢?请问高手,这种情况该如何解决。
新生成的触发器上,总有一个小叉,被触发的触发器报“ora-04098 触发器 无效且未通过重新确认”错误。
如下图:实际触发器并没用错误。只要重新编译一次就可以运行。
但由于数量很多,况且可能随时有修改,所以靠人工点击不太靠谱。
so ~~大家帮帮忙呀~另外,我使用的是oracle8i数据库
可是,用程序建立的触发器,总是需要在oracle数据库里重新生成一次,才能正常工作。
这是什么原因呢?请问高手,这种情况该如何解决。
新生成的触发器上,总有一个小叉,被触发的触发器报“ora-04098 触发器 无效且未通过重新确认”错误。
如下图:实际触发器并没用错误。只要重新编译一次就可以运行。
但由于数量很多,况且可能随时有修改,所以靠人工点击不太靠谱。
so ~~大家帮帮忙呀~另外,我使用的是oracle8i数据库
看不到
end;
/用这样的方式,应该是可以compile一次的。或者是你后面有ddl语句。修改了trigger里依赖的表,所以需要重新compile
如果是这样,也不要紧。在所有的语句后面,加上
alter trigger XXXX compile; 在编译一次就可以叻。
这里有错蛮??如果不管它,直接点运行:
http://hi.csdn.net/space-20644-do-album-picid-422184.html
就说编译成功,也可以正确执行。
http://hi.csdn.net/space-20644-do-album-picid-422186.html
1、放在一个tigger所有语句后
alter trigger XXXX compile; 不得行,会提示,alter不能放置在这个位置。
2、新开一个sql窗口,运行,提示成功,但小叉还在,刷新后也没反应。
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 ;