Использовать триггер после вставки для обновления таблицы?

Я использую триггер на SQL-сервере для обновления запаса таблицы, когда продажа вставляется в другую таблицу, но триггер ничего не делает с таблицей, я подозреваю, что у меня должна быть ошибка, которую я не могу расшифровать. Когда я выполняю тестовые вставки, он не показывает никаких изменений в первой таблице.

Таблицы:

 Sku VARCHAR (50) PRIMARY KEY, 
 Stock NUMERIC (38)
);

CREATE TABLE dbo.Salida_Producto (
 Numero_Salida INT PRIMARY KEY,
 Sku VARCHAR (50),
 Cantidad_Salida INT,
 FOREIGN KEY(Sku) REFERENCES Stock(Sku)
);
--Test Tabla Stock. Test Values.
INSERT INTO dbo.Stock VALUES ('El Mitchies',100);
INSERT INTO dbo.Stock VALUES ('La Karencilla',200);
INSERT INTO dbo.Stock VALUES ('Perro',300);```


The Trigger:

CREATE TRIGGER [dbo].[tr_for_insert]
   ON  [dbo].[Salida_Producto]
   AFTER INSERT
AS 
BEGIN
DECLARE 
@Item varchar,
@Cuantos numeric
    SELECT @Item = INSERTED.Sku,
            @Cuantos = INSERTED.Cantidad_Salida
            FROM INSERTED
    UPDATE Stock
        SET Stock = Stock - @Cuantos
        WHERE Sku = @Item

END;
GO

Тестовые вставки

INSERT INTO dbo.Salida_Producto VALUES (1, 'El Mitchies',3);
INSERT INTO dbo.Salida_Producto VALUES (2, 'La Karencilla',6);
INSERT INTO dbo.Salida_Producto VALUES (3,'Perro',130); ```

У меня проблема в том, что в окне сообщения написано:

(0 затронутых строк)

(затронуты 1 ряд)


person Christian Villarroel    schedule 28.11.2019    source источник
comment
Вы совершаете классическую ошибку многих людей, предполагая, что Inserted будет содержать только одну запись, хотя на самом деле она может содержать много. Вам нужно использовать логику на основе набора, в соответствии со всем, что связано с базой данных, и написать обновление, которое учитывает несколько строк.   -  person Dale K    schedule 28.11.2019
comment
Спасибо за поправку, в следующий раз учту.   -  person Christian Villarroel    schedule 28.11.2019


Ответы (1)


Вы думали, что ваш триггер с построчным подходом. Это не очень хорошая практика. Вы должны научиться мыслить в соответствии с подходом.

Таким образом, лучший способ достичь вашей цели должен быть примерно таким:

Update S
      Set S.Stock = S.Stock - I.Cantidad_Salida
   From Stock S
   Inner Join inserted I
   On S.Sku = I.Sku
person EddiGordo    schedule 28.11.2019
comment
Спасибо, я попробую ответить и дам вам знать, смогу ли я изменить его, спасибо за ответ, я буду придерживаться подхода по умолчанию. - person Christian Villarroel; 28.11.2019
comment
@ChristianVillarroel Принятие ответа - person Dale K; 28.11.2019