Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 创建在更改任何指定列时触发的触发器_Oracle_Plsql_Plsqldeveloper - Fatal编程技术网

Oracle 创建在更改任何指定列时触发的触发器

Oracle 创建在更改任何指定列时触发的触发器,oracle,plsql,plsqldeveloper,Oracle,Plsql,Plsqldeveloper,当列出的任何列被更改时,我试图触发触发器。我希望bb_产品表上列出的任何列发生更改时,bb_产品表上的特定列都会更新。在我将列名添加到INSERT INTO行之前编译的代码(虽然在任何列被更改时,它实际上不会导致触发器触发),但一旦我添加列名,我就开始出现错误“error(5,18):PLS-00201:必须声明标识符'PRODUCTNAME'”、“error(9,18)”:PLS-00201:标识符“价格”必须声明为“等” 我是新手,对PL/SQL不太在行,我很难弄清楚如何声明标识符,或者这是

当列出的任何列被更改时,我试图触发触发器。我希望bb_产品表上列出的任何列发生更改时,bb_产品表上的特定列都会更新。在我将列名添加到INSERT INTO行之前编译的代码(虽然在任何列被更改时,它实际上不会导致触发器触发),但一旦我添加列名,我就开始出现错误“error(5,18):PLS-00201:必须声明标识符'PRODUCTNAME'”、“error(9,18)”:PLS-00201:标识符“价格”必须声明为“等”

我是新手,对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;

为清晰起见进行编辑:我的目标是将userID、sysdate和新旧值添加到bb_prodchg_审计表中,每次更改bb_产品表

更新
谓词中,必须将列名指定为字符串。所以使用例如

IF UPDATING('SALEPRICE')...
而不是

IF UPDATING(SALEPRICE)...
请记住,列名区分大小写,在Oracle中默认为大写


祝您好运。

更新
谓词中,必须将列名指定为字符串。所以使用例如

IF UPDATING('SALEPRICE')...
而不是

IF UPDATING(SALEPRICE)...
请记住,列名区分大小写,在Oracle中默认为大写


祝你好运。

修复了一个问题,但又造成了另一个问题。我将所有的IF(更新)调整为'UPPER'格式,它跳到了“Error(8,39):PL/SQL:ORA-00904:“USERID”:无效标识符”。如果我将所有这些更改为'UPPER'格式,它会告诉我在插入到's'的所有位置都缺少SELECT关键字。请注意,我缺少下划线。谢谢你的帮助!修复了一个问题,但造成了另一个问题。我将所有的IF(更新)调整为'UPPER'格式,它跳到了“Error(8,39):PL/SQL:ORA-00904:“USERID”:无效标识符”。如果我将所有这些更改为'UPPER'格式,它会告诉我在插入到's'的所有位置都缺少SELECT关键字。请注意,我缺少下划线。谢谢你的帮助!