Инициирующий столбец после выпуска обновления - PullRequest
0 голосов
/ 11 октября 2018

У меня проблема с триггером, который я пытаюсь внедрить в свою программу.

У меня есть таблица с названием Products, в которой есть столбцы, такие как ID, PRICE и DISCOUNT

Я сделал этотриггер:

CREATE or REPLACE TRIGGER DISCOUNT_TRIGGER
    after update of DISCOUNT on PRODUCTS
    for each row
    BEGIN
            update PRODUCTS set PRICE = PRICE * (1 - DISCOUNT);
    END;

Я хочу изменить столбец цены строки после обновления столбца скидки.

Например, если я выполню этот запрос:

UPDATE PRODUCTS SET DISCOUNT = 25 WHERE ID = 25;

Когда я выполняю этот запрос, я получаю следующую ошибку:

Error starting at line : 11 in command -
update products set DISCOUNT = 25 where id = 1
Error report -
ORA-04091: table YASSINEII.PRODUCTS is mutating, trigger/function may not see it
ORA-06512: at "YASSINEII.DISCOUNT_TRIGGER", line 2
ORA-04088: error during execution of trigger 'YASSINEII.DISCOUNT_TRIGGER'

Есть идеи, что я здесь не так делаю?

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Вы не можете запросить таблицу, из-за которой сработал триггер внутри самого триггера.

Но в этом случае я не вижу необходимости.Вы можете использовать: new для доступа к значениям, которые вы выбираете из таблицы

CREATE or REPLACE TRIGGER DISCOUNT_TRIGGER
    after update of DISCOUNT on PRODUCTS
    for each row
    BEGIN
            update PRODUCTS set :new.PRICE = :new.PRICE * (1 - korting_percentage);
    END;
0 голосов
/ 11 октября 2018

Вы можете избежать изменения таблицы с помощью составных триггеров.

Вот пример (не забудьте изменить таблицу и столбцы, по которым они соответствуют вашей модели данных):

CREATE or REPLACE TRIGGER DISCOUNT_TRIGGER
    FOR UPDATE of DISCOUNT on PRODUCTS
    COMPOUND TRIGGER

    BEFORE STATEMENT is
    BEGIN
            UPDATE your_table SET your_column = your_value WHERE your_condition;
    END BEFORE STATEMENT;

    --BEFORE EACH ROW is
    --BEGIN
            --Put here the statement
    --END BEFORE EACH ROW;

    --AFTER STATEMENT is
    --BEGIN
            --Put here the statement
    --END AFTER STATEMENT;

    --AFTER EACH ROW is
    --BEGIN
            --Put here the statement
    --END AFTER EACH ROW;

END;
0 голосов
/ 11 октября 2018

Я предполагаю, что вы действительно хотите триггер "перед обновлением", который обновляет значения в одной строке.Что-то вроде:

CREATE or REPLACE TRIGGER DISCOUNT_TRIGGER
    before update of DISCOUNT on PRODUCTS
    for each row
BEGIN
    :new.price := :new.price * ( 1 - :new.korting_percentage);
END;
...