2014-12-19 36 views
0

我无法弄清楚问题出在哪里。这里是我的触发 我PRODUKT表有属性:produktid,名称,manufacturing_price,SALE_PRICE 我试图让马努价格Oracle无效触发器ORA-04098

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; 

顶点显示对象状态无效

和我的销售价格1.1值不能改变生产价格 错误ORA-04098:触发器 '' 是无效的,失败再验证

感谢

+1

编译与'SHOW ERRORS'选项检查 – Exhausted 2014-12-19 06:32:39

+0

如果该因素(关系)始终有效,您可以改为使用虚拟列。 – user2672165 2014-12-19 07:31:47

+0

您可能与您的问题无关:您是否明确地使用小写字母(这是通过双引号实现的)触发名称?通过将所有内容都转换为上层隐式,Oracle标准将(伪)不区分大小写。如果您必须/想要,您应该只使用区分大小写的命名。 – evilive 2014-12-19 07:35:11

回答

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; 

未经检验。谨防错别字!