当前位置: 代码迷 >> Oracle开发 >> 大家帮小弟我看上触发器报这个错:ora 04098 触发器无效未通过验证
  详细解决方案

大家帮小弟我看上触发器报这个错:ora 04098 触发器无效未通过验证

热度:121   发布时间:2016-04-24 07:18:40.0
大家帮我看下触发器报这个错:ora 04098 触发器无效未通过验证
Name Type Nullable Default Comments 
-------- ------------ -------- ------- -------- 
EMPNO NUMBER(4)  
ENAME VARCHAR2(10) Y  
JOB VARCHAR2(9) Y  
MGR NUMBER(4) Y  
HIREDATE DATE Y  
SAL NUMBER(7,2) Y  
COMM NUMBER(7,2) Y  
DEPTNO NUMBER(2) Y  
表结构是这样的,为什么触发器会报错啊,找不到哪里错了,大家帮忙看下哦

create trigger emp_trigger2 
before update of sal,comm or delete
on emp
for each row
when (old.job='SALESMAN')
BEGIN
 case when updating('sal') then
  if :new.sal< :old.sal then
  raise_application_error(-20001,'职业为saleman的员工工资不能降');
  end if;
  when updating('comm') then
  if :new.comm< :old.comm then
  raise_application_error((-20001,'职业为saleman的员工comm不能降');
  end if;
  when deleting
  raise_application_error(-20003,'职业为saleman的员工不能删');
  end case;
  end
  drop trigger emp_trigger
update emp set sal=2000.00 where ename='ALLEN' and job='SALEMAN'
  

 

------解决方案--------------------
SQL code
create or replace trigger emp_trigger2  before update of sal,comm or deleteon empfor each rowwhen (old.job='SALESMAN')BEGIN case     when updating('sal') then  if :new.sal< :old.sal then  raise_application_error(-20001,'职业为saleman的员工工资不能降');  end if;  when updating('comm') then  if :new.comm< :old.comm then  raise_application_error(-20001,'职业为saleman的员工comm不能降');--多个括号  end if;  when deleting then --少个then  raise_application_error(-20003,'职业为saleman的员工不能删');  end case;  end;/--你的测试部分估计也不会有你想要的结果,job='SALESMAN'吧,还有ename注意大小写,可用upper(ename)=...update emp set sal=2000.00 where ename='ALLEN' and job='SALEMAN'