如何在oracle中创建行级触发器?

时间:2013-02-06 06:42:06

标签: oracle plsql triggers oracle11g

我在hr架构中有一个名为employee的表,我需要在此表上创建行级触发器,这样每当我尝试更新员工表上的薪水时,我都要确保薪水不是下降!

我试过这个,但是我收到了一个错误:

  

错误报告:ORA-01748:此处仅允许使用简单的列名01748。   00000 - “这里只允许使用简单的列名

CREATE or REPLACE TRIGGER salary_dec_trigger 
BEFORE UPDATE OF emp.salary
ON emp 
FOR EACH ROW 
BEGIN 
if(:new.salary>:old.salary)
then

update emp set emp.salary=emp.salary+:new.salary where emp.employee_id=:new.employee_id;
else 
rollback;
end if;
END; 
/ 

2 个答案:

答案 0 :(得分:1)

CREATE or REPLACE TRIGGER salary_dec_trigger 
BEFORE UPDATE OF salary ON emp 
FOR EACH ROW 
BEGIN 
  if(:new.salary < :old.salary) then
    raise_application_error(-20001, 'Salary can''t be decreased');
  end if;
END; 

答案 1 :(得分:0)

据我所知,从你的代码中你可以尝试一下,每当你更新一个雇员的工资时,你实际上将它与他以前的工资相加,对吧?只允许增加工资,从不减少。

那你为什么不说:new.salary = :old.salary + :new.salary?并跳过回滚,只需执行:new.salary = :old.salary;

如果它不起作用,你应该尝试一个带有自主交易的程序来执行该操作,但这是前触发器应该允许你直接执行的操作(check this here)。