为表更改的审核日志创建 Oracle 触发器时出错

问题描述 投票:0回答:1

我正在尝试在 Oracle 中创建触发器来维护特定表中的更改日志。我的目标是将 CLIENTS 表中的插入、更新和删除记录到名为 CLIENTS_LOG 的审核表中。但是,当尝试创建触发器时,我遇到了与 NEW 和 OLD 绑定变量相关的错误。看来链接变量是错误的。

这是我正在使用的触发代码:

CREATE OR REPLACE TRIGGER CLIENTS_LOG_TRIGGER
AFTER INSERT OR UPDATE OR DELETE ON CLIENTS
FOR EACH ROW
DECLARE
    V_OLD_NAME VARCHAR2(100);
    V_OLD_LASTNAME VARCHAR2(100);
BEGIN
    IF INSERTING THEN
        INSERT INTO CLIENTS_LOG (AUDIT_ID, CLIENT_ID, NEW_NAME, NEW_LASTNAME, MODIFICATION_DATE, MODIFYING_USER)
        VALUES (AUDIT_SEQ.NEXTVAL, :NEW.CLIENT_ID, :NEW.NAME, :NEW.LASTNAME, SYSTIMESTAMP, USER);
    ELSIF UPDATING THEN
        SELECT NAME, LASTNAME INTO V_OLD_NAME, V_OLD_LASTNAME FROM CLIENTS WHERE CLIENT_ID = :OLD.CLIENT_ID;
        INSERT INTO CLIENTS_LOG (AUDIT_ID, CLIENT_ID, OLD_NAME, NEW_NAME, OLD_LASTNAME, NEW_LASTNAME, MODIFICATION_DATE, MODIFYING_USER)
        VALUES (AUDIT_SEQ.NEXTVAL, :OLD.CLIENT_ID, V_OLD_NAME, :NEW.NAME, V_OLD_LASTNAME, :NEW.LASTNAME, SYSTIMESTAMP, USER);
    ELSIF DELETING THEN
        INSERT INTO CLIENTS_LOG (AUDIT_ID, CLIENT_ID, OLD_NAME, OLD_LASTNAME, MODIFICATION_DATE, MODIFYING_USER)
        VALUES (AUDIT_SEQ.NEXTVAL, :OLD.CLIENT_ID, :OLD.NAME, :OLD.LASTNAME, SYSTIMESTAMP, USER);
    END IF;
END;

另外,这是表格:

-- CLIENTS 的表结构

CREATE TABLE CLIENTS (
    CLIENT_ID NUMBER PRIMARY KEY,
    NAME VARCHAR2(100),
    LASTNAME VARCHAR2(100)
);

-- Table structure for CLIENTS_LOG
CREATE TABLE CLIENTS_LOG (
    AUDIT_ID NUMBER PRIMARY KEY,
    CLIENT_ID NUMBER,
    OLD_NAME VARCHAR2(100),
    NEW_NAME VARCHAR2(100),
    OLD_LASTNAME VARCHAR2(100),
    NEW_LASTNAME VARCHAR2(100),
    MODIFICATION_DATE TIMESTAMP,
    MODIFYING_USER VARCHAR2(100)
);

我尝试更改日志表或修改 :OLD 和 :NEW 子句,但我一直遇到同样的问题。

oracle
1个回答
0
投票

你的触发器中有这个:

SELECT NAME, LASTNAME INTO V_OLD_NAME, V_OLD_LASTNAME FROM CLIENTS WHERE CLIENT_ID = :OLD.CLIENT_ID;

您不能从正在修改的基表中进行选择,否则您将收到突变错误。相反,只需使用

:OLD
伪行来引用旧值。

© www.soinside.com 2019 - 2024. All rights reserved.