0

朋友,我对级联触发有疑问。我有 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;

/

请给我意见。谢谢。

4

1 回答 1

1

ora-04090表示您在该表上已经有一个 AFTER INSERT ... FOR EACH ROW 触发器。Oracle 不喜欢这样,因为触发器触发的顺序是不可预测的,这可能会导致不可预测的结果,而 Oracle真的不喜欢这些。

因此,您的第一步是将两组代码合并到一个触发器中。然后真正的乐趣开始了。

大概只有一行data匹配的当前值id_data(如果不是你的数据模型被弄乱了,你的情况就没有希望了)。无论如何,这意味着当前行已经让您可以访问 和 的:new.sum:new.id_tool。因此,您不需要对data表进行这些查询:删除这些选择将消除“变异表”错误的可能性。

作为一般观察,维护这样的聚合或汇总表通常是一个坏主意。通常最好只在需要时查询信息。如果你真的有大量的数据,那么你应该使用物化视图来维护摘要,而不是手动滚动一些东西。

于 2013-01-01T10:17:48.727 回答