我必须创建一个触发器,限制任何用户更新 job_title
是会计师的员工的工资。例如:如果有人使用以下命令更新工资:
UPDATE Employees
SET Salary = 11000
WHERE job_id = '101';
然后它首先检查与 101 的 job_title
关联的 job_id
是否是会计。如果是,则抛出一条错误消息,指出您无法更新会计师的工资。这是我的触发代码,但它无法正常工作。
CREATE OR REPLACE TRIGGER salaryrestruction
BEFORE UPDATE ON employees
DECLARE job_title employees.job_title%type;
BEGIN
IF UPDATING('SALARY') AND JOB_TITLE='accountant'
THEN RAISE_APPLICATION_ERROR
(-20501,'You cannot update SALARY of accountant');
END IF;
END;
这是我的表格数据:
EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL PHONE_NUMBER HIRE_DATE JOB_TITLE SALARY COMMISSION_PCT
----------- -------------------- ------------------------- ------------------------- -------------------- --------- -------------------- ---------- --------------
102 Randall Zlotkey zlotkey@gmail.com 13675464345 22-MAY-02 Manager 20000
103 John Bernstein bernsteinex@gmail.com 12876454345 23-JUN-03 Accountant 10000 .2
104 Peter Sully sully@gmail.com 13187754345 01-FEB-03 Executive 8000 .4
105 Alberto Hall hall@gmail.com 10000354345 06-APR-05 Human Resources 4500
106 Karen Olsen olsen@gmail.com 13144444345 13-MAY-05 Marketing 10000 .1
107 Peter Christopher christopher@gmail.com 13456754345 13-MAY-06 Administration 12000 .2
101 Lex De Haan lex@gmail.com 13124354345 19-JAN-01 Accountant 9000 .3
答案 0 :(得分:1)
只有行级触发器才能看到正在更新的每个单独的职位。然后,您可以在触发器正文中使用 :new.job_title
或在标题中作为 new.job_title
引用它。
如果您在标头中使用 when
条件,则无需在触发器正文中检查它。您也无需检查 before update
触发器中的触发器是否正在更新。
但是,如果这是您的业务规则,您确实需要检查工资是否发生变化。 (我没有对之前为 null 或被更新为 null 的salary 的可能性进行编码——如果可能的话,那么你将需要多几行代码。)
create or replace trigger salaryrestriction
before update on employees for each row
when (new.job_title = 'Accountant')
begin
if :new.salary <> :old.salary then
raise_application_error(-20501, 'You cannot update SALARY of accountant');
end if;
end;
我们不需要以大写形式编写代码,因为它不是 COBOL,也不是 1974 年。