创建一个在任何指定列更改时触发的触发器
Creating a trigger that fires when any of the specified columns are changed
我试图让我的触发器在列出的任何列发生更改时触发。当 bb_product table 上列出的任何列发生更改时,我希望更新 bb_prodchg_audit table 上的特定列。我在将列名添加到 INSERT INTO 行之前编译了我的代码(尽管它实际上并没有在更改任何列时触发触发器)但是一旦我添加了列名,我就开始收到错误 "Error(5,18): PLS-00201: identifier 'PRODUCTNAME' must be declared", "Error(9,18): PLS-00201: identifier 'PRICE' must be declared" 等等。
我是新手,对 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_audit table 以及 bb_product table 的每次更改.
在您的 UPDATING
谓词中,列名必须指定为字符串。所以使用例如
IF UPDATING('SALEPRICE')...
而不是
IF UPDATING(SALEPRICE)...
请记住,列名区分大小写并且在 Oracle 中默认为大写。
祝你好运。
我试图让我的触发器在列出的任何列发生更改时触发。当 bb_product table 上列出的任何列发生更改时,我希望更新 bb_prodchg_audit table 上的特定列。我在将列名添加到 INSERT INTO 行之前编译了我的代码(尽管它实际上并没有在更改任何列时触发触发器)但是一旦我添加了列名,我就开始收到错误 "Error(5,18): PLS-00201: identifier 'PRODUCTNAME' must be declared", "Error(9,18): PLS-00201: identifier 'PRICE' must be declared" 等等。
我是新手,对 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_audit table 以及 bb_product table 的每次更改.
在您的 UPDATING
谓词中,列名必须指定为字符串。所以使用例如
IF UPDATING('SALEPRICE')...
而不是
IF UPDATING(SALEPRICE)...
请记住,列名区分大小写并且在 Oracle 中默认为大写。
祝你好运。