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' 无效且未通过重新确认这是我的操作过程,大家看看吧!写了!一定给分!
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'执行过程中出错
当我们用另外的触发器就可以看到: 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中已经有数据了!
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显示一下错误信息,这样才能帮你分析原因
After 好像不支持 行级触发器 所以应该使用 Befor 级触发器
在行级别后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
AFTER DELETE
ON DBO.AA
FOR EACH ROW
begin
insert into AA_BAK values(:old.aa1,:old.aa2);
end;
我改了触发器名字,还是不行呀,用SQLPLUS创建警告有编译错误
AFTER DELETE
ON DBO.AA
FOR EACH ROW
begin
insert into AA_BAK values(:old.aa1,:old.aa2);--指明要插入字段
end;
ORA-04098: 触发器 'GJPT.TRI_AA' 无效且未通过重新确认
commit;
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' 无效且未通过重新确认这是我的操作过程,大家看看吧!写了!一定给分!
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'执行过程中出错
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中已经有数据了!
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显示一下错误信息,这样才能帮你分析原因
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