обновить несколько строк триггером после вставки (сервер sql) - PullRequest
3 голосов
/ 10 декабря 2011

У меня есть таблица orderDetails, которая содержит продукты заказа

  • 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 Ответ

5 голосов
/ 10 декабря 2011

Суть в том, что вы предполагаете, что триггер будет вызываться для каждой вставляемой строки - это , а не случай .

Ваш триггер будет называться один раз на оператор - но этот оператор может вставлять сразу несколько строк.

В таком случае таблица 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...