2014-12-19 64 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; 

未經檢驗。謹防錯別字!