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

大家帮我看下触发器报这个错: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 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 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'