Создание триггера, который срабатывает при изменении любого из указанных столбцов

#oracle #plsql #plsqldeveloper

#Oracle #plsql #plsqldeveloper

Вопрос:

Я пытаюсь заставить мой триггер срабатывать при изменении любого из перечисленных столбцов. Я хотел бы, чтобы определенные столбцы в таблице bb_prodchg_audit обновлялись при изменении любого из перечисленных столбцов в таблице bb_product. Мой код был скомпилирован до того, как я добавил имена столбцов во вставку в строки (хотя на самом деле это не вызывало срабатывания триггера при изменении любого из столбцов), но как только я добавил имена столбцов, я начал получать сообщение об ошибке «Ошибка (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 и old amp; new в таблицу bb_prodchg_audit с каждым изменением из таблицы bb_product.

Ответ №1:

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

 IF UPDATING('SALEPRICE')...
 

вместо

 IF UPDATING(SALEPRICE)...
 

Имейте в виду, что имена столбцов чувствительны к регистру и по умолчанию используются в Oracle в ВЕРХНЕМ РЕГИСТРЕ.

Желаю удачи.

Комментарии:

1. Исправлена одна проблема, но создана другая. Я настроил все IF (ОБНОВЛЕНИЕ) на «ВЕРХНИЙ» формат, и он перешел к «Ошибка (8,39): PL / SQL: ORA-00904: «ИДЕНТИФИКАТОР ПОЛЬЗОВАТЕЛЯ»: недопустимый идентификатор». Если я изменил все из них на «ВЕРХНИЙ» формат, это говорит мне, что мне не хватает ключевого слова SELECT во всех INSERT INTO.

2. Поцарапайте это, мне не хватало подчеркивания. Спасибо за вашу помощь!