简体   繁体   中英

Creating a audit trigger which update a audit table automatically

My tables are

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
);

If a customer gives a zero evaluation Cus_evo=0 , the details of their Borrowing ( Cus_Name from CUSTOMER , the BK_Name from Book , B_Date from Borrow , Loc_Name of the copy from Location and Cus_evo from Borrow ) must be placed in an audit table.

The trigger that I created:

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;
/

I get this error:

Errors: TRIGGER AUDIT_TRIGGER Line/Col: 3/9 PLS-00049: bad bind variable 'OLD.CUS_NAME' Line/Col: 3/24 PLS-00049: bad bind variable 'OLD.BK_NAME' Line/Col: 3/51 PLS-00049: bad bind variable 'OLD.LOC_NAME'

  1. You can not use old and new values from other tables only from table Borrwo when you are creating trigger

  2. You need to specify if you want to check new or old value in WHEN clause

    CREATE OR REPLACE TRIGGER "AUDIT_TRIGGER" BEFORE INSERT OR UPDATE ON Borrow --I have removed double quotes FOR EACH ROW WHEN (new.Cus_evo = 0) -- I have added new. before the name of the column BEGIN INSERT INTO Audit_Table VALUES (:OLD.Fee, :OLD.Copy_id, :OLD.Cus_id, :OLD.B_Date, :OLD.Cus_evo); -- I have replaced column names from other tables with column names -- from table "Borrow" END; /

Here is a demo:

DEMO

In this demo I have removed

CONSTRAINT fk_Borrow_Copy_id_FK FOREIGN KEY (Copy_id) REFERENCES Copy(Copy_id),

from table Borrow spec because it references on the table Copy that we do not have here in your question.

After I have read the comment from @Belayer I have concluded you will need two triggers like this:

CREATE OR REPLACE TRIGGER "AUDIT_TRIGGER"
BEFORE INSERT ON Borrow
FOR EACH ROW
when (new.Cus_evo = 0) 
BEGIN
    INSERT INTO Audit_Table
    VALUES (:new.Copy_id, :new.Copy_id, :new.B_Date, :new.Cus_id, :new.Cus_evo);
END;
/

CREATE OR REPLACE TRIGGER "AUDIT_TRIGGER2"
BEFORE UPDATE ON Borrow
FOR EACH ROW
when (OLD.Cus_evo = 0) 
BEGIN
    INSERT INTO Audit_Table
    VALUES (:OLD.Copy_id, :OLD.Copy_id, :OLD.B_Date, :OLD.Cus_id, :OLD.Cus_evo);
END;
/

Here is a demo with demonstration:

DEMO

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM