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
(或尝试);可能还有其他问题。
我有一个 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
(或尝试);可能还有其他问题。