高手帮忙:为什么创建触发器是会报错:ORA-04098: 触发器 'DB0.SS' 无效且未通过重新确认,
为什么创建触发器是会报错:
ORA-04098: 触发器 'DB0.SS' 无效且未通过重新确认
问题点数:0、回复次数:18Top
1 楼jiezhi(风满袖)回复于 2003-11-01 20:38:11 得分 0
代碼有錯Top
2 楼naodex(心动)回复于 2003-11-02 17:07:33 得分 0
帮忙看看下面的代码有什么错?谢谢!给分!
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;Top
3 楼beckhambobo(beckham)回复于 2003-11-02 18:38:43 得分 0
当然有错,触发器名字与表名相同Top
4 楼naodex(心动)回复于 2003-11-02 18:55:13 得分 0
不行啊,楼上
我改了触发器名字,还是不行呀,用SQLPLUS创建警告有编译错误Top
5 楼wupangzi(无本之木)回复于 2003-11-02 19:10:00 得分 0
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;
Top
6 楼naodex(心动)回复于 2003-11-02 19:24:35 得分 0
创建成功,但是删除数据时报错!
ORA-04098: 触发器 'GJPT.TRI_AA' 无效且未通过重新确认Top
7 楼wupangzi(无本之木)回复于 2003-11-02 19:45:53 得分 0
你建立后提交了吗?
commit;Top
8 楼naodex(心动)回复于 2003-11-03 08:58:44 得分 0
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
1
SQL> select * from aa_bak;
未选定行
SQL> delete from aa;
delete from aa
*
ERROR 位于第 1 行:
ORA-04098: 触发器 'GJPT.TRI_AA' 无效且未通过重新确认
这是我的操作过程,大家看看吧!写了!一定给分!
Top
9 楼wupangzi(无本之木)回复于 2003-11-04 20:10:54 得分 0
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'执行过程中出错Top
10 楼wupangzi(无本之木)回复于 2003-11-04 20:14:33 得分 0
当我们用另外的触发器就可以看到:
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中已经有数据了!Top
11 楼lrchen(derek)回复于 2003-11-28 13:25:14 得分 0
老大,你的问题解决了么,我也碰到同样的问题,你是如何解决的,给我回一帖阿!Top
12 楼xinpingf(白开心)回复于 2003-11-28 13:30:24 得分 0
应该用BEFORE DELETE吧?
Top
13 楼xinpingf(白开心)回复于 2003-11-28 13:37:24 得分 0
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
1
SQL> select * from aa_bak;
未选定行
SQL> delete from aa;
delete from aa
*
ERROR 位于第 1 行:
ORA-04098: 触发器 'GJPT.TRI_AA' 无效且未通过重新确认
这是我的操作过程,大家看看吧!写了!一定给分!
这个在我这里执行没有任何错误出现
我觉得问题处在:
1、当前的用户是不是gjpt
2、当前用户的权限?
你在创建完TRIGGER出错后,应该用SHOW ERROR显示一下错误信息,这样才能帮你分析原因Top
14 楼xinpingf(白开心)回复于 2003-11-28 13:38:47 得分 0
另:显示一下AA_BAK的表结构~Top
15 楼wwl007(疑难杂症)回复于 2003-11-28 17:00:51 得分 0
After 好像不支持 行级触发器 所以应该使用 Befor 级触发器Top
16 楼ydfok(发芽的石头)回复于 2003-11-29 00:56:53 得分 0
关注中。。。Top
17 楼beckhambobo(beckham)回复于 2003-11-30 18:33:18 得分 0
在行级别后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改成beforeTop
18 楼gegangqiao(困惑的男人)回复于 2003-12-01 23:09:58 得分 0
下面的这一句不要
FOR EACH ROWTop




