在特定表中进行更改时更新某些表

时间:2013-02-06 11:00:12

标签: sql sql-server-2005 triggers

这是我的示例数据库的数据库图表:

enter image description here

我希望在 OrderDetails 表格的帮助下更新 成分 表格> 表格触发

但问题是 成分 表可能有一个或多个条目的条目。我想更新 Ingredient 表中与项目关联的所有条目。有关更多说明,请参阅以下算法:

对于当前项目 成分 中的每个 成分
使用以下公式更新 成分 表中的 数量
配方:成分。数量=成分。数量 - (Item.Quantity * Ingredients.Quantity)

(整个想法是每当订单ID的项目被添加/更新/删除时,成分数量应按提及的数量减少/增加)

1 个答案:

答案 0 :(得分:1)

我们不在SQL中进行迭代或循环(除非我们可以避免它)。我们描述我们想要发生什么,让SQL解决如何

我们通常也不会存储我们可以计算的数据。我们总能计算出已经订购的每种成分的数量。 (如果有另一个表跟踪我们供应商的交货情况,也可以计算出来)。如果性能是一个问题,我们会考虑创建一个索引视图 - 其中包含计算值,但SQL Server负责自动维护它。

通过这种方式,您可以避免任何差异(例如,如果您的触发器被禁用)。

所有这一切,我认为你想要的触发器是:

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