我在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;
/
答案 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)。