朋友,我对级联触发有疑问。 我有2个表,表数据有3个属性(id_data,sum和id_tool),表工具有3个属性(id_tool,name,sum_total)。表数据和工具使用id_tool连接。
我想为更新信息sum_total创建触发器。因此,如果我在表数据上插入sum_total,那么tool.id_tool = data.id_tool也会更新表工具。
我创建了这个触发器,但错误是ora-04090。
create or replace trigger aft_ins_tool
after insert on data
for each row
declare
v_stok number;
v_jum number;
begin
select sum into v_jum
from data
where id_data= :new.id_data;
select sum_total into v_stok
from tool
where id_tool=
(select id_tool
from data
where id_data= :new.id_data);
if inserting then
v_stok := v_stok + v_jum;
update tool
set sum_total=v_stok
where id_tool=
(select id_tool
from data
where id_data= :new.id_data);
end if;
end;
/
请给我意见。 感谢。答案 0 :(得分:1)
ora-04090
表示您已经在该表上有一个AFTER INSERT ... FOR EACH ROW触发器。 Oracle不喜欢这样,因为teh触发fire的顺序是不可预测的,这可能导致不可预测的结果,而Oracle 真的不喜欢那些。
因此,您的第一步是将两组代码合并为一个触发器。然后开始真正的乐趣。
据推测,data
中只有一行与id_data
的当前值相匹配(如果不是你的数据模型已经集结,那么你的情况就没有希望了)。无论如何,这意味着当前行已经允许您访问:new.sum
和:new.id_tool
的值。因此,您不需要data
表上的那些查询:删除这些选择将消除“改变表”错误的可能性。
作为一般观察,维护这样的聚合或汇总表通常是一个坏主意。通常最好只在需要时查询信息。如果您确实拥有大量数据,那么您应该使用物化视图来维护摘要,而不是手动滚动。