【问题标题】:Creating a trigger that fires when any of the specified columns are changed创建在任何指定列发生更改时触发的触发器
【发布时间】:2019-09-08 06:26:40
【问题描述】:

我试图让我的触发器在列出的任何列发生更改时触发。我希望 bb_prodchg_audit 表上的特定列在 bb_product 表上列出的任何列发生更改时更新。我的代码在我将列名添加到 INSERT INTO 行之前编译(尽管当任何列被更改时它实际上并没有导致触发器触发)但是一旦我添加了列名,我开始收到错误“错误(5 ,18):PLS-00201:必须声明标识符“PRODUCTNAME””、“错误(9,18):PLS-00201:必须声明标识符“PRICE””等等。

我是新手,对 PL/SQL 不太了解,我无法弄清楚如何声明标识符,或者这是否是解决这种情况的正确方法。

CREATE OR REPLACE TRIGGER BB_PRODCHG_AUDIT 
AFTER UPDATE OF productname, price, salestart, saleend, saleprice ON bb_product
FOR EACH ROW

BEGIN
    IF (UPDATING(productname)) THEN
        INSERT INTO bb_prodchg_audit (userid, chg_date, name_old, name_new)
        VALUES (USER, SYSDATE, :OLD.productname, :NEW.productname);
    END IF;
    IF (UPDATING(price)) THEN
        INSERT INTO bb_prodchg_audit (userid, chg_date, price_old, price_new)
            VALUES(USER, SYSDATE, :OLD.price, :NEW.price);
    END IF;
    IF (UPDATING(salestart)) THEN
        INSERT INTO bb_prodchg_audit (userid, chg_date, start_old, start_new)
            VALUES(USER, SYSDATE, :OLD.salestart, :NEW.salestart);
    END IF;
    IF (UPDATING(saleend)) THEN
        INSERT INTO bb_prodchg_audit (userid, chg_date, end_old, end_new)
            VALUES(USER, SYSDATE, :OLD.saleend, :NEW.saleend);
    END IF;
    IF (UPDATING(saleprice)) THEN
        INSERT INTO bb_prodchg_audit (userid, chg_date, sale_old, sale_new)
            VALUES(USER, SYSDATE, :OLD.saleprice, :NEW.saleprice);
    END IF;
END;

为清楚起见进行编辑:我的目标是在 bb_product 表的每次更改时将 userID、sysdate 以及旧值和新值添加到 bb_prodchg_audit 表中。

【问题讨论】:

    标签: oracle plsql plsqldeveloper


    【解决方案1】:

    在您的UPDATING 谓词中,列名必须指定为字符串。所以使用例如

    IF UPDATING('SALEPRICE')...
    

    而不是

    IF UPDATING(SALEPRICE)...
    

    请记住,列名区分大小写,并且在 Oracle 中默认为大写。

    祝你好运。

    【讨论】:

    • 修复了一个问题,但又产生了另一个问题。我将所有 IF(UPDATING) 调整为 'UPPER' 格式,它跳转到“错误(8,39):PL/SQL:ORA-00904:“USERID”:无效标识符”。如果我将所有这些都更改为“UPPER”格式,它会告诉我我在所有 INSERT INTO 中都缺少 SELECT 关键字。
    • 从头开始,我少了一个下划线。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多