2016-09-28 82 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)。这是显而易见的逻辑,即当有人更改基础值结果时也会被改变。