Oracle无效触发器ORA-04098

时间:2014-12-19 06:15:12

标签: sql oracle triggers

我无法弄清问题在哪里。这是我的触发器 我的produkt表有属性:produktid,name,manufacturing_price,sale_price 我试图使销售价格为制造价格的1.1值

CREATE OR REPLACE TRIGGER  "predajna_cena" 
AFTER update of "MANUFACTURING_PRICE" on "PRODUKT"
begin
UPDATE PRODUKT SET SALE_PRICE = MANUFACTURING_PRICE*1.1;
end;
/
ALTER TRIGGER  "predajna_cena" ENABLE;

apex显示对象状态无效

我无法改变制造价格 错误ORA-04098:触发' '无效且重新验证失败

感谢

1 个答案:

答案 0 :(得分:2)

CREATE OR REPLACE TRIGGER  "predajna_cena" 
AFTER update of "MANUFACTURING_PRICE" on "PRODUKT"
begin
UPDATE PRODUKT SET SALE_PRICE = MANUFACTURING_PRICE*1.1;
end;
/

如果您能够使此触发器生效,则会在"PRODUKT"的每次更新后更新所有价格。可能不是你想要的。

对于这种情况,您应该使用BEFORE UPDATE ... FOR EACH ROW触发器,在插入产品价格之前更改产品价格:NEW."SALE_PRICE" = :NEW."MANUFACTURING_PRICE"*1.1

这样的事可能:

CREATE OR REPLACE TRIGGER  "predajna_cena" 
BEFORE UPDATE OF "MANUFACTURING_PRICE" ON "PRODUKT"
FOR EACH ROW
BEGIN
  :NEW.SET SALE_PRICE := :NEW.MANUFACTURING_PRICE*1.1;
END;
     

未测试。小心拼写错误!


根据您的需要,其他选项将使用虚拟列而不是触发器来实现相同的结果。

DROP TRIGGER "predajna_cena";
ALTER TABLE "PRODUKT" DROP COLUMN "MANUFACTURING_PRICE";
ALTER TABLE "PRODUKT" ADD "MANUFACTURING_PRICE" 
                      GENERATED ALWAYS AS ("SALE_PRICE" * 1.1) VIRTUAL;
     

未测试。小心拼写错误!