2016-09-28 27 views
1

我有這樣的觸發甲骨文觸發產生錯誤的數據

create or replace trigger upd_totprc_trg 
after insert or update or delete of total_price on sales_detail 
for each row 
declare 
v_diff number := 0; 
v_master number; 
begin 

if inserting then 
    v_master := :new.master_id; 
    v_diff := :new.total_price; 
elsif updating then 
    v_master := :new.master_id; 
    v_diff := :new.total_price - :old.total_price; 
elsif deleting then 
    v_master := :old.master_id; 
    v_diff := :old.total_price * -1; 
end if; 

update sales_master 
set value = value + v_diff 
where id = v_master; 
end; 
/

它計算在sales_detail.total_price的變化和更新sales_master.value

問題是total_price列是定義爲數量和unit_price的乘積的虛擬列。 當我輸入新的細節行時,觸發器似乎不會捕獲新的計算值,即使它是after。我的問題是:虛擬列表達式的執行與觸發器的運行衝突嗎?請注意,當我將total_price再次設置爲正常列時,它會返回正確的值。

我使用的是Oracle 12c中

回答

0

,您的觸發是更新,插入或刪除虛擬列。但是此列未插入或更新。它是在有人請求數據時計算的。所以不觸發triogger是正確的價值。更多不允許更新或插入虛擬列。嘗試直接更新虛擬列時會生成ORA-54017: UPDATE operation disallowed on virtual columns
您需要觸發的是用於計算虛擬值的列(quantityunit_price)。這是顯而易見的邏輯,即當有人更改基礎值結果時也會被改變。