我要在程序中实现的触发器存在问题。
我有一个名为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'
有什么主意我在这里做错什么吗?
答案 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