0

友人、カスケードトリガーについて質問があります。2つのテーブル、3つの属性(id_data、sum、およびid_tool)を持つテーブルデータ、および3つの属性(id_tool、name、sum_total)を持つテーブルツールがあります。テーブルデータとツールはid_toolを使用して結合されます。

更新情報sum_totalのトリガーを作成したい。したがって、テーブルデータに挿入すると、tool.id_tool=data.id_toolが更新されるテーブルツールのsum_totalも更新されます。

このトリガーを作成しましたが、エラー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 トリガーが既にあることを示します。トリガーが起動する順序は予測不可能であり、予測できない結果につながる可能性があるため、オラクルはそれを好まない.

したがって、最初のステップは、2 つのコード セットを 1 つのトリガーにマージすることです。それから本当の楽しみが始まります。

おそらくdata、 の現在の値に一致する行は 1 つだけですid_data(そうでなければ、データ モデルが台無しになり、状況に希望がありません)。:new.sumとにかく、それは現在の行がすでにと の値にアクセスできることを意味します:new.id_tool。したがって、テーブルでこれらのクエリは必要ありませんdata。これらの選択を削除すると、「テーブルの変更」エラーの可能性がなくなります。

一般的な観察として、このような集約テーブルまたは要約テーブルを維持することは一般的に悪い考えです。通常は、必要なときに情報を照会するだけの方が適切です。本当に膨大な量のデータがある場合は、手動で何かをローリングするのではなく、具体化されたビューを使用して要約を維持する必要があります。

于 2013-01-01T10:17:48.727 に答える