我正在尝试在 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 子句,但我一直遇到同样的问题。
你的触发器中有这个:
SELECT NAME, LASTNAME INTO V_OLD_NAME, V_OLD_LASTNAME FROM CLIENTS WHERE CLIENT_ID = :OLD.CLIENT_ID;
您不能从正在修改的基表中进行选择,否则您将收到突变错误。相反,只需使用
:OLD
伪行来引用旧值。