1

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

在此处输入图像描述

我想在Table Trigger的帮助下对OrderDetails表进行更改时更新成分表

但问题是成分表可能有一个或多个项目条目。我想更新成分表中与项目关联的所有条目。更多描述,请参见下面的算法:

对于当前项目的成分中的每个成分:使用公式 更新成分表中的数量:公式 成分.数量 = 成分.数量 - (项目.数量 * 成分.数量)

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

4

1 回答 1

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
于 2013-02-06T14:09:31.080 回答