插入后用触发器更新多行(sql server)

时间:2011-12-10 15:50:32

标签: sql sql-server stored-procedures triggers

我有一个包含订单产品的表订单详细信息

  • 的productId
  • 颜色
  • 尺寸

和表库存

  • 的productId
  • 尺寸
  • 颜色
  • 股票

订单完成后,我使用此查询在表orderDetails

中插入项目
INSERT INTO orderDetail(orderId, productId, productColor, productSize, productQuantity , cost productName)
    SELECT     
       @orderId, products_translations.id, cart.productColor, cart.productSize, 
       cart.productQuantity, cart.cost, products_translations.name
    FROM cart 
    INNER JOIN products_translations ON cart.productID = products_translations.id
    WHERE     
        (cart.cartId = @cartId) AND 
        (products_translations.language = 1)

然后我在表orderDetails上有一个触发器:

ALTER TRIGGER [dbo].[scalaProdotti]
   ON [dbo].[orderDetail]
   FOR INSERT
AS

DECLARE @size int
DECLARE @color char(6)
DECLARE @quantity int
DECLARE @product int

BEGIN
    SELECT @size = productSize FROM inserted
    SELECT @color = productColor FROM inserted
    SELECT @quantity = productQuantity FROM inserted
    SELECT @product = productId FROM inserted
    UPDATE stock SET quantity =  quantity - @quantity WHERE size=@size AND color=@color AND product=@product
END

有了这个触发器,我想减少库存,但只有第一个产品受到影响,其他数量保持不变。

我错过了什么?

谢谢。

1 个答案:

答案 0 :(得分:5)

主要观点是:您假设将为插入的每一行调用触发器 - 这是不是这种情况

您的触发器将被称为每个语句 - 但该语句可以一次插入多行。

在这种情况下,触发器中的Inserted表将包含多行以及您的语句:

SELECT @size = productSize FROM inserted
SELECT @color = productColor FROM inserted
SELECT @quantity = productQuantity FROM inserted
SELECT @product = productId FROM inserted

将失败或将恰好仅选择插入的第一行并忽略其余插入。

您需要重写触发器以应对Inserted同时包含多个插入行的事实

触发器中的代码应如下所示:

UPDATE stock 
FROM Inserted i
SET 
     stock.quantity = quantity - i.quantity 
WHERE 
     stock.size = i.size 
     AND stock.color = i.color 
     AND stock.product = i.product