日期:2014-05-17  浏览次数:20889 次

急:ora-04098:触发器无效且未通过重新确认
我要对一张表,在写的SQL语句时更新第二个字段,触发器自动更新第三个字段(需求是时间),结果提示 
ora-04098:触发器“tri_key”无效且未通过重新确认。

--对自身表触发修改
--创建表
drop table test_4;
create table test_4
(
  aa varchar2(10),
  bb varchar2(10),
  cc varchar2(10)
);

--第一步:创建程序包,设立全局变量 
create or replace package proc_testtrigger
is
  p_aa   test_4.aa%type;
begin
  null;
end proc_testtrigger;
/

--第二步:创建行触发器,将key值存入全局变量中
create or replace trigger tri_key
  after update on test_4 for each row
begin
  proc_testtrigger.p_aa := :new.aa;
end tri_key;
/

--第三步:创建表触发器,根本全局变量更新数据
create or replace trigger tri_upd
  after update on test_4
begin
  update test_4 set cc = 'zhi' where aa = proc_testtrigger.p_aa;
end tri_upd;
/

--插入数据
insert into test_4 (aa, bb, cc) values ('a', 'b', '');
insert into test_4 (aa, bb, cc) values ('a', 'c', '');
insert into test_4 (aa, bb, cc) values ('a', 'e', '');


--SQL语句,更新语句 ,想实现在更新的同时,触发器更新CC字段
update test_4 set bb = 'gggg' where aa = 'a';
自身表触发修改,ORA-04098 UPDATE

------解决方案--------------------
其实包和第一个触发器我不知道你干嘛用的  完全可以去掉:
触发器这么写就可以了:

create or replace trigger tri_upd
  before update on test_4
  for each row
begin
  :new.cc := 'zhi';
end tri_upd;