1

これは私のサンプルデータベースのデータベース図です。

ここに画像の説明を入力してください

Table Triggerを使用してOrderDetailsテーブルに変更が加えられたときに、IngredientTableを更新したい

ただし、問題は、IngredientsテーブルにItemの1つ以上のエントリが含まれている可能性があることです。アイテムに関連付けられている材料テーブルのすべてのエントリを更新したい。詳細については、以下のアルゴリズムを参照してください。

現在のアイテムの材料の各材料について次の式を使用して、材料の数量テーブルを 更新します。 式:Ingredient.Quantity = Ingredient.Quantity-(Item.Quantity * Ingredients.Quantity)

(全体的な考え方は、OrderIDのアイテムが追加/更新/削除されるたびに、成分の数量を上記の数量だけ増減する必要があるということです)

4

1 に答える 1

1

SQLで反復またはループすることはありません(回避できない場合を除く)。をしたいのかを説明し、SQLにその方法を説明させます。

また、通常、計算できるデータは保存しません。注文した各材料の量はいつでも計算できます。(サプライヤからの配信を追跡する別のテーブルがある場合は、それを計算することもできます)。パフォーマンスが問題である場合は、インデックス付きビューの作成を検討します。これには計算値が含まれますが、SQLServerが自動的に維持します。

このようにして、不一致が忍び寄るのを防ぎます(たとえば、トリガーが無効になっている場合)。

そうは言っても、あなたが望むトリガーは次のとおりだと思います。

create trigger T_OrderDetails
on OrderDetails
after insert,update,delete
as
begin
    update ing
    set Quantity = ing.Quantity - ((COALESCE(iod.Quantity,0) - COALESCE(dod.Quantity,0)) * i.Quantity)
    from
    inserted iod
        full outer join
    deleted dod
        on
            iod.ItemID = dod.ItemID
        inner join
    Ingredients i
        on
            i.ItemID = iod.ItemID or
            i.ItemID = dod.ItemID --Cope with OUTER join above
        inner join
    Ingredient ing
        on
            i.IngID = ing.IngID
end
于 2013-02-06T14:09:31.080 に答える