更新问题后触发列

时间:2018-10-11 19:39:31

标签: oracle plsql database-trigger

我要在程序中实现的触发器存在问题。

我有一个名为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 :(得分:1)

我猜您真的需要一个“更新前”触发器来更新一行中的值。像这样:

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;

答案 1 :(得分:0)

您无法查询导致触发器内部触发的表。

但是在这种情况下,我认为没有必要。您可以使用: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;

答案 2 :(得分:0)

您可以避免使用复合触发器来突变表异常。

这里是示例(请记住更改表和列以使其适合您的数据模型):

httpd-vhosts.conf