这是我的示例数据库的数据库图表:
我希望在 OrderDetails 表格的帮助下更新 成分 表格> 表格触发
但问题是 成分 表可能有一个或多个条目的条目。我想更新 Ingredient 表中与项目关联的所有条目。有关更多说明,请参阅以下算法:
对于当前项目的 成分 中的每个 成分 :
使用以下公式更新 成分 表中的 数量 :
配方:成分。数量=成分。数量 - (Item.Quantity * Ingredients.Quantity)
(整个想法是每当订单ID的项目被添加/更新/删除时,成分数量应按提及的数量减少/增加)
答案 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