【问题标题】:Create trigger which updates a separate "audit table" automatically after update of a table创建在更新表后自动更新单独的“审计表”的触发器
【发布时间】:2021-05-23 08:43:11
【问题描述】:

我的桌子是

Book

CREATE TABLE Book 
(
    Bk_id CHAR(06) NOT NULL,
    BK_Name VARCHAR(60) NOT NULL,
    Author VARCHAR(30) NOT NULL,
    Price NUMERIC(03) NOT NULL,
    No_of_copies NUMERIC(02) NOT NULL,
    CONSTRAINT Book_PK PRIMARY KEY (Bk_id) 
);

Location

CREATE TABLE Location 
(
    Loc_id CHAR(06) NOT NULL,
    Loc_Name VARCHAR(15) NOT NULL,
    Stock NUMERIC(02) NOT NULL,
    CONSTRAINT Location_PK PRIMARY KEY (Loc_id)
);

Customer

CREATE TABLE Customer 
(
    Cus_id CHAR(06) NOT NULL, 
    Cus_Name VARCHAR(25) NOT NULL,  
    Gender VARCHAR(06) NOT NULL, 
    TP CHAR(12) NOT NULL,
    Address VARCHAR(40) NOT NULL, 
    CONSTRAINT Customer_PK PRIMARY KEY (Cus_id)
);

Copy

CREATE TABLE Copy 
(
    Copy_id CHAR(06) NOT NULL,
    Bk_id CHAR(06) NOT NULL,
    Loc_id CHAR(06) NOT NULL,
    Opinion CHAR(02) NOT NULL,
    CONSTRAINT pk_Copy PRIMARY KEY (Copy_id),
    CONSTRAINT fk_Copy_Bk_id_FK FOREIGN KEY (Bk_id) REFERENCES Book(Bk_id),
    CONSTRAINT fk_Copy_Loc_id_FK FOREIGN KEY (Loc_id) REFERENCES Location(Loc_id)
);

Borrow

CREATE TABLE Borrow 
(
    Cus_evo NUMERIC(02) NOT NULL,
    B_Date DATE NOT NULL,
    R_Date DATE NOT NULL,
    Fee NUMERIC(03) NOT NULL,
    Copy_id CHAR(06) NOT NULL,
    Cus_id CHAR(06) NOT NULL,
    CONSTRAINT pk_Borrow PRIMARY KEY (Cus_id,Copy_id),
    CONSTRAINT fk_Borrow_Copy_id_FK FOREIGN KEY (Copy_id) REFERENCES Copy(Copy_id),
    CONSTRAINT fk_Borrow_Cus_id_FK FOREIGN KEY (Cus_id) REFERENCES Customer(Cus_id)
);

Audit_Table

Create table Audit_Table
(
    Cus_Name VARCHAR(25) NOT NULL,
    BK_Name VARCHAR(60) NOT NULL,
    B_Date DATE NOT NULL,
    Loc_Name VARCHAR(15) NOT NULL,
    Cus_evo NUMERIC(02) NOT NULL
);

如果客户给出零评价Cus_evo=0,他们的借款详情(Cus_Name from CUSTOMERBK_Name from BookB_Date from BorrowLoc_Name来自LocationCus_evo 来自Borrow 的副本)必须放在审计表中。

我创建的触发器:

CREATE OR REPLACE TRIGGER "AUDIT_TRIGGER"
BEFORE
INSERT OR UPDATE ON Borrow
FOR EACH ROW
    WHEN (new.Cus_evo = 0)
    BEGIN
        INSERT INTO Audit_Table
        VALUES (:OLD.Cus_Name, :OLD.BK_Name, :OLD.B_Date, :OLD.Loc_Name, :OLD.Cus_evo);
    END;
/

我收到此错误:

错误:TRIGGER AUDIT_TRIGGER
行/列:3/9 PLS-00049:错误的绑定变量“OLD.CUS_NAME”
行/列:3/24 PLS-00049:错误的绑定变量“OLD.BK_NAME”
行/列:3/51 PLS-00049:绑定变量错误“OLD.LOC_NAME”

【问题讨论】:

    标签: sql oracle plsql triggers oracle19c


    【解决方案1】:

    这些变量引用其他表上的列。因此它们在 borrow :OLD 命名空间的命名空间中不可用。所以你需要做的是编写一个查询,使用来自borrow 记录的外键值来查找这些表。像这样的:

    CREATE OR REPLACE TRIGGER "AUDIT_TRIGGER"
    BEFORE
    INSERT OR UPDATE ON Borrow
    FOR EACH ROW
        WHEN (new.Cus_evo = 0)
        BEGIN
            INSERT INTO Audit_Table
            select cus.Cus_Name, book.BK_Name, :NEW.B_Date, loc.Loc_Name, :NEW.Cus_evo
            from       customer cus
            cross join location loc
            cross join copy 
            cross join book
            where cus.cus_id   = :new.cus_id
            and   copy.copy_id = :new.copy_id
            and   book.bk_id   = copy.bk_id
            and   loc.loc_id   = copy.loc_id
        END;
    /
    

    请注意,我建议使用 :NEW 命名空间。这适用于 INSERTING 操作,也适合您在 UPDATING 时的用例。

    【讨论】:

    • >错误:TRIGGER AUDIT_TRIGGER >行/列:2/9 PL/SQL:忽略 SQL 语句 >行/列:3/83 PL/SQL:ORA-00923:未在预期的位置找到 FROM 关键字>行/列:12/8 PLS-00103:在预期以下之一时遇到符号“文件结尾”:
    猜你喜欢
    • 2021-05-20
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    相关资源
    最近更新 更多