Oracle11g 在oracle中创建触发器以更新其他表时出现问题
我正在创建一个触发器来更新要审核的其他表。 我正在审核的主表是“已雇用”,审核表是“薪资历史”。每次在Employed表中进行更新时,都必须更新薪资历史记录。 我在oracle 11g中使用此触发器:Oracle11g 在oracle中创建触发器以更新其他表时出现问题,oracle11g,triggers,Oracle11g,Triggers,我正在创建一个触发器来更新要审核的其他表。 我正在审核的主表是“已雇用”,审核表是“薪资历史”。每次在Employed表中进行更新时,都必须更新薪资历史记录。 我在oracle 11g中使用此触发器: CREATE OR REPLACE TRIGGER salary_auditing AFTER UPDATE ON employed REFERENCING NEW AS NEW OLD AS OLD BEGIN INSERT INTO SALARY_HISTORY(ID, EMPLOYED
CREATE OR REPLACE TRIGGER salary_auditing
AFTER UPDATE ON employed
REFERENCING NEW AS NEW OLD AS OLD
BEGIN
INSERT INTO SALARY_HISTORY(ID, EMPLOYED_ID, OLD_SALARY, NEW_SALARY, DATE_MODIFIED) VALUES (SELECT MAX(ID)+1 FROM SALARY_HISTORY, ID, :OLD.salary, :NEW.salary, SYSDATE)
END salary_auditing
问题是,当我运行此触发器时,我收到以下错误:
Relatório de erros -
ORA-04082: referências NEW ou OLD não permitidas nos gatilhos de nível de tabela
04082. 00000 - "NEW or OLD references not allowed in table level triggers"
*Cause: The trigger is accessing "new" or "old" values in a table trigger.
*Action: Remove any new or old references.
在英语中,这意味着表nivel中不允许使用新值或旧值
我应该做什么修改?- Oracle具有行级和语句级触发器。只有行级触发器可以访问
和:new
伪记录。您的触发器当前定义为语句级触发器。您需要为每一行添加:old
,使其成为行级触发器
- 在
语句中获取insert
是一个非常糟糕的主意。除非只有一个用户应用程序,否则这将导致多个会话获得相同的值,并导致重复的键错误。创建一个序列并使用该序列max(id)+1
- 说
引用新旧一样的
是毫无意义的。除非您打算为
和:new
伪记录提供不同的别名,否则请忽略此项。而且你几乎不应该使用不同的别名:old
create sequence seq_salary_history_id
start with <<value larger than what is currently in the table>>;
CREATE OR REPLACE TRIGGER salary_auditing
AFTER UPDATE ON employed
FOR EACH ROW
BEGIN
INSERT INTO SALARY_HISTORY(ID,
EMPLOYED_ID,
OLD_SALARY,
NEW_SALARY,
DATE_MODIFIED)
VALUES (seq_salary_history_id.nextval,
:new.ID,
:OLD.salary,
:NEW.salary,
SYSDATE);
END salary_auditing;
CREATE OR REPLACE TRIGGER salary_auditing
AFTER UPDATE OF salary ON employed
FOR EACH ROW