【发布时间】:2021-02-01 21:56:48
【问题描述】:
这个触发器在单行删除时工作正常,但在多行上
CREATE TRIGGER [dbo].[AfterDeleteStockUpdate]
ON [dbo].[ItemLedger]
AFTER DELETE
AS
DECLARE @productId uniqueidentifier
SELECT @productId = del.Product
FROM deleted del;
UPDATE products
SET inStock = (SELECT SUM(ISNULL(inQty, 0)) - SUM(ISNULL(outQty, 0))
FROM itemledger
WHERE product = @productId),
PurchasedValue = (SELECT SUM(ISNULL(PurchaseAmount, 0)) - SUM(ISNULL(Amount, 0))
FROM itemledger
WHERE product = @productId)
WHERE id = @productId
【问题讨论】:
-
您的答案似乎可以解决您的主要问题。但它遵循了您尝试的模式,这是非常低效的。为什么效率低下?因为您将分类帐表中所有相关的现有行求和 - 绝对没有理由这样做。您应该做的是使用已删除的表来简单地更新受影响的产品。如果我们假设存在正确的外键,您对 ISNULL 的使用是不正确的,并且可能不需要。
-
也许物化视图可能是更好的解决方案?这将自动调整分类帐中的更改,而无需任何触发代码。
标签: sql sql-server tsql triggers