更新问题后触发列

Triggering column after update issue

我尝试在我的程序中实施触发器时遇到问题。

我有一个名为 Products 的 table,它包含 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'

知道我做错了什么吗?

我猜您真的想要一个 "before update" 触发器来更新单行中的值。类似于:

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;

您无法查询导致触发器在触发器本身内部触发的 table。

但在这种情况下,我认为没有必要。您可以使用 :new 访问您从 table

中选择的值
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;

您可以使用复合触发器避免改变 table 异常。

这里是示例(记得更改 table 以及它们适合您的数据模型的列):

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;