更新问题后触发列
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;
我尝试在我的程序中实施触发器时遇到问题。
我有一个名为 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;