这是我的示例数据库的数据库图:
我想在Table Trigger的帮助下对OrderDetails表进行更改时更新成分表
但问题是成分表可能有一个或多个项目条目。我想更新成分表中与项目关联的所有条目。更多描述,请参见下面的算法:
对于当前项目的成分中的每个成分:使用公式
更新成分表中的数量:公式:
成分.数量 = 成分.数量 - (项目.数量 * 成分.数量)
(整个想法是,每当添加/更新/删除 OrderID 的项目时,成分数量应按所提及的数量减少/增加)
这是我的示例数据库的数据库图:
我想在Table Trigger的帮助下对OrderDetails表进行更改时更新成分表
但问题是成分表可能有一个或多个项目条目。我想更新成分表中与项目关联的所有条目。更多描述,请参见下面的算法:
对于当前项目的成分中的每个成分:使用公式
更新成分表中的数量:公式:
成分.数量 = 成分.数量 - (项目.数量 * 成分.数量)
(整个想法是,每当添加/更新/删除 OrderID 的项目时,成分数量应按所提及的数量减少/增加)
我们不会在 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