我有一个包含订单产品的表订单详细信息
和表库存
订单完成后,我使用此查询在表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
有了这个触发器,我想减少库存,但只有第一个产品受到影响,其他数量保持不变。
我错过了什么?
谢谢。
答案 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