oracle12c 中的审计触发器正在编译错误
Posted
技术标签:
【中文标题】oracle12c 中的审计触发器正在编译错误【英文标题】:audit trigger in oracle12c is compiling with error 【发布时间】:2018-01-05 07:27:57 【问题描述】: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;
/
在 book table 中给出了评估,但是评估,rate 应该由客户给出,如果客户给出的 rate 为空值,下面的触发器应该工作。但是我们收到一个错误,说语句被忽略,表或视图不存在。我检查了两次或更多,但所有的表名和 ID 都是完美的。请给我们解决错误的解决方案
【问题讨论】:
Could SELECT TOWN INTO v_location FROM COPY WHERE B_ISBN = v_isbn;是问题吗?在其他任何地方,您都在使用 x_ 样式前缀,但出于某种原因,您不使用 TOWN 和 COPY。此外,您的 INSERT 具有不带前缀的位置和评估 真棒乔纳森,我在表名上犯了一个错误。我们已经修复了,非常感谢,触发器编译时没有错误,但是当我们尝试使用空值进行评估时,我们收到一个错误,提示“精确获取返回的行数超过请求的行数”,“执行期间出错”触发'EVA''所以我不知道如何解决这个问题,如果你能帮助我,我会很高兴 我已经添加了答案 【参考方案1】:这里看起来有些不对劲。这是一个 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 的字段。根据你的图,应该都是真的,只是我不知道字段名。
【讨论】:
是的,这是正确的,但即使我们完成了更改,我们也会收到同样的错误,说“获取多于一行”。:-( INSERT INTO c_evaluation (e_desc, b_isbn, c_id, r_id) VALUES ('nice book', 14002, 29, null) 错误报告 - ORA-01422: 精确提取返回的行数超过了请求的行数 ORA -06512:在“OPS$1629266.EVA”,第 14 行 ORA-04088:执行触发器“EVA”时出错 您能用修改后的代码编辑您的问题,以便我检查是否还有其他问题吗? 我怀疑是错误的 SELECT INTO 语句之一返回了多个记录。例如,您确定 c_id 在 C_LEND 中仅存在一次(是否意味着您只能借一次??)并且 b_isbn 在 COPY 中是唯一的。这些很可疑!我认为您需要添加到 WHERE 子句以确保仅找到一条记录 是的,其实你是对的,在我的关系中,一本书有很多本,(每本书有2-5本),那本可以借给客户。以上是关于oracle12c 中的审计触发器正在编译错误的主要内容,如果未能解决你的问题,请参考以下文章
在 Oracle PL/SQL 中创建触发器时如何解决“编译错误成功”错误?