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列是一个虚拟列,定义为数量和单位价格的乘积。当我输入新的详细信息行时,触发器似乎没有捕捉到新的计算值,即使它是一个after. 我的问题是:虚拟列表达式的执行与触发器的运行是否冲突?请注意,当我再次将其设置total_price为普通列时,它返回了正确的值。

我正在使用 Oracle 12c

4

1 回答 1

0

您的触发器用于更新、插入或删除虚拟列。但是此列未插入或更新。它是在有人请求数据时计算的。所以不触发触发器是正确的值。更何况它不允许更新或插入虚拟列。ORA-54017: UPDATE operation disallowed on virtual columns尝试直接更新虚拟列时会产生。
您需要的是在作为计算虚拟一 (quantityunit_price) 的基础的列上触发。这是很明显的逻辑,当有人更改基值时,结果也会更改。

于 2016-11-11T17:43:57.607 回答