Oracle SQL - ORA-04079: 触发器规范无效

Oracle SQL - ORA-04079: invalid trigger specification

我有一个 EMPLOYEE table,我想创建一个触发器来记录员工佣金发生变化 (EMPCOMM)。我创建了一个 EMPLOYEE_COMM_AUDIT table 来处理这个问题。我想出了以下代码:

CREATE OR REPLACE TRIGGER EMPLOYEE_COMM_AUDIT_TRIGGER 
BEFORE DELETE OR INSERT OR UPDATE OF EMP_COMM ON EMPLOYEE 
IF (NEW.EMP_COMM != OLD.EMPCOMM)
BEGIN
  UPDATE EMPLOYEE_COMM_AUDIT
  SET EMPLOYEE_COMM_AUDIT.EMP_NUM = EMPLOYEE.EMP_NUM;
  SET EMPLOYEE_COMM_AUDIT.CHANGE_DATE = (SYSDATE, 'MM-DD-YYYY HH24:MI:SS') FROM DUAL;
  SET EMPLOYEE_COMM_AUDIT.USERNAME = CURRENT_USER;
  SET EMPLOYEE_COMM_AUDIT.ACTION = NULL;
  SET EMPLOYEE_COMM_AUDIT.OLD_COMM = OLD.EMPCOMM;
  SET EMPLOYEE_COMM_ADUDIT.NEW_COMM = NEW.COMM;
  DBMS_OUTPUT_LINE("Employee Commisions Audit has been updated);
END;

但是 Oracle SQL 告诉我:ORA-04079: invalid trigger specification,但我没有在任何地方看到任何红色下划线来指示错误所在。

有人可以帮帮我吗?我试图在这些论坛上看看,但我似乎无法在任何地方找到可靠的答复。

提前致谢。

你的 UPDATE 语法完全错误:

UPDATE EMPLOYEE_COMM_AUDIT
  SET CHANGE_DATE = SYSDATE,
      USERNAME = CURRENT_USER,
      ACTION = NULL,
      OLD_COMM = OLD.EMPCOMM,
      NEW_COMM = NEW.COMM
  WHERE EMP_NUM = :NEW.EMPNUM;

变化和假设:

  • SET只出现一次
  • table名字不需要重复。
  • SET 表达式由逗号而不是分号分隔。
  • 无需将 sysdate 转换为日期即可将其分配给日期列。
  • 您需要一个 WHERE 子句来指定应更新的行。

这修复了 update(或尝试);可能还有其他问题。