Создание триггера, который срабатывает при изменении любого из указанных столбцов - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь заставить мой триггер срабатывать при изменении любого из перечисленных столбцов. Я хотел бы, чтобы определенные столбцы в таблице 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;

Правка для ясности: моя цель - добавить userID, sysdate и старые & новые значения в таблицу bb_prodchg_audit с каждым изменением из таблицы bb_product.

1 Ответ

2 голосов
/ 18 апреля 2019

В ваших UPDATING предикатах имя столбца должно быть указано в виде строки. Так что используйте, например,

IF UPDATING('SALEPRICE')...

вместо

IF UPDATING(SALEPRICE)...

Имейте в виду, что имена столбцов чувствительны к регистру и по умолчанию имеют значение UPPERCASE в Oracle.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...