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 12C审核触发器

在 Oracle PL/SQL 中创建触发器时如何解决“编译错误成功”错误?

删除oracle 11g用户删除不掉,报ORA-04098错误!

从 oracle 中的触发器进行审计

oracle 12c开启关闭统一审计

Oracle 12c PLSQL 合并错误