oracle12c 中的审计触发器编译错误
audit trigger in oracle12c is compiling with error
refer my ER
CREATE OR REPLACE TRIGGER EVA
AFTER INSERT ON C_EVALUATION
FOR EACH ROW
DECLARE
v_cid number(25);
v_isbn number(25);
v_cname VARCHAR2(50);
v_tittle VARCHAR2(150);
v_date date;
v_location VARCHAR2(50);
v_eva VARCHAR2(250);
BEGIN
v_cid:=:OLD.C_ID;
v_isbn:=:OLD.B_ISBN;
v_eva:=:OLD.e_desc;
SELECT C_NAME INTO v_cname FROM C_CUSTOMER WHERE C_ID = v_cid;
select l_date INTO v_date FROM C_LEND where c_id = v_cid;
select B_TITTLE INTO v_tittle FROM C_BOOK WHERE B_ISBN = v_isbn;
SELECT TOWN INTO v_location FROM COPY WHERE B_ISBN = v_isbn;
IF :NEW.R_ID IS NULL
THEN
INSERT INTO e_audit (
c_name,
b_tittle,
h_date,
location,
evaluation
) VALUES (
v_cname,
v_tittle,
v_date,
v_location,
v_eva
);
END IF;
END;
/
书中table给出了评价,但是评价、评分应该由客户给出,如果客户给出的评分为空值,下面的触发器应该可以工作。但是我们收到一条错误消息,说语句被忽略,table 或视图不存在。我检查了两次或更多次,但所有 table 名称和 ID 都是完美的。请给我们解决错误的方法
这里似乎还有其他地方不对。这是一个 INSERT 触发器,但您指的是 :OLD.e_desc。这是错误的。 INSERT 触发器应该只引用 :NEW。 DELETE 触发器应该只引用 :OLD,而 UPDATE 触发器可以引用 :NEW 和 :OLD。 :OLD 给出更改前记录的值,但是对于 INSERT 没有这样的记录。我认为您真正想要的是使用 :NEW.e_desc、:NEW.c_id 和 :NEW.b_isbn。但我猜有点!
编辑
您的图表没有显示所有字段?但我认为你需要的是:
SELECT TOWN into v_location FROM copy inner join lend
ON lend.copyid = copy.copyid WHERE b_isbn = v_isbn
AND lend.c_id = v_cid
我在这里假设 lend 有一个字段 copyid 链接到 copy.copyid 并且它有一个字段链接到客户 ID。我还假设副本有一个链接到书中的 b_isbn 的字段。按照你的图,应该都是真的,就是不知道字段名。
refer my ER
CREATE OR REPLACE TRIGGER EVA
AFTER INSERT ON C_EVALUATION
FOR EACH ROW
DECLARE
v_cid number(25);
v_isbn number(25);
v_cname VARCHAR2(50);
v_tittle VARCHAR2(150);
v_date date;
v_location VARCHAR2(50);
v_eva VARCHAR2(250);
BEGIN
v_cid:=:OLD.C_ID;
v_isbn:=:OLD.B_ISBN;
v_eva:=:OLD.e_desc;
SELECT C_NAME INTO v_cname FROM C_CUSTOMER WHERE C_ID = v_cid;
select l_date INTO v_date FROM C_LEND where c_id = v_cid;
select B_TITTLE INTO v_tittle FROM C_BOOK WHERE B_ISBN = v_isbn;
SELECT TOWN INTO v_location FROM COPY WHERE B_ISBN = v_isbn;
IF :NEW.R_ID IS NULL
THEN
INSERT INTO e_audit (
c_name,
b_tittle,
h_date,
location,
evaluation
) VALUES (
v_cname,
v_tittle,
v_date,
v_location,
v_eva
);
END IF;
END;
/
书中table给出了评价,但是评价、评分应该由客户给出,如果客户给出的评分为空值,下面的触发器应该可以工作。但是我们收到一条错误消息,说语句被忽略,table 或视图不存在。我检查了两次或更多次,但所有 table 名称和 ID 都是完美的。请给我们解决错误的方法
这里似乎还有其他地方不对。这是一个 INSERT 触发器,但您指的是 :OLD.e_desc。这是错误的。 INSERT 触发器应该只引用 :NEW。 DELETE 触发器应该只引用 :OLD,而 UPDATE 触发器可以引用 :NEW 和 :OLD。 :OLD 给出更改前记录的值,但是对于 INSERT 没有这样的记录。我认为您真正想要的是使用 :NEW.e_desc、:NEW.c_id 和 :NEW.b_isbn。但我猜有点!
编辑
您的图表没有显示所有字段?但我认为你需要的是:
SELECT TOWN into v_location FROM copy inner join lend
ON lend.copyid = copy.copyid WHERE b_isbn = v_isbn
AND lend.c_id = v_cid
我在这里假设 lend 有一个字段 copyid 链接到 copy.copyid 并且它有一个字段链接到客户 ID。我还假设副本有一个链接到书中的 b_isbn 的字段。按照你的图,应该都是真的,就是不知道字段名。