Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle11g 在oracle中创建触发器以更新其他表时出现问题_Oracle11g_Triggers - Fatal编程技术网

Oracle11g 在oracle中创建触发器以更新其他表时出现问题

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

我正在创建一个触发器来更新要审核的其他表。 我正在审核的主表是“已雇用”,审核表是“薪资历史”。每次在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_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