2016-05-22 2 views
4
INSERT INTO SaleItem (ProdId, SaleQuantity) 
SELECT ProdId, BasketProdQuantity FROM Basket; 

CREATE TRIGGER TRG_Stock_Decrease 
    ON SaleItem 
AFTER INSERT 
AS 
DECLARE @ProdId INT 
DECLARE @SaleQuantity INT 
SELECT @ProdId=ProdId,@SaleQuantity=SaleQuantity FROM inserted 
UPDATE Product SET [email protected] WHERE [email protected] 
UPDATE Product SET ProdNoOfSold [email protected] WHERE [email protected] 
DELETE FROM Basket Where ProdId = @ProdId 

Когда я вставляю данные из корзины в SaleItem, он работает хорошо, но срабатывает только для первого вставленного идентификатора. Как я могу заставить его работать для всех идентификаторов?Вставка из таблицы в другую таблицу и активирующий триггер

EDIT! Я сменил курок, как это, и это вроде бы сработало, я думаю.

CREATE TRIGGER TRG_Stock_Decrease 
    ON SaleItem 
AFTER INSERT 
AS 
BEGIN 
UPDATE Product SET ProdStockQuantity = ProdStockQuantity - (Select SaleQuantity From inserted Where Product.ProdId = inserted.ProdId) Where Product.ProdId IN (Select ProdId From inserted) 
UPDATE Product SET ProdNoOfSold =ProdNoOfSold + (Select SaleQuantity From inserted Where Product.ProdId = inserted.ProdId) Where Product.ProdId IN (Select ProdId From inserted) 
DELETE FROM Basket WHERE Basket.ProdId IN (Select ProdId From inserted) 
END 

Это правильно?

+0

среды SQL Server Management Studio 2012, если вы спросили, что. –

+0

Исправлено, но переполнено множеством 'SELECT FROM вставлено' :) – gofr1

ответ

3

Нет необходимости в каждой строке или вложенными выбирает, только внутреннее соединение с вставлено :)

CREATE TRIGGER TRG_Stock_Decrease 
    ON SaleItem 
AFTER INSERT 
AS 
    UPDATE P 
    SET ProdStockQuantity=ProdStockQuantity-i.SaleQuantity, 
     ProdNoOfSold =ProdNoOfSold+i.SaleQuantity 
    FROM Product P 
    INNER JOIN inserted i 
     ON P.ProdId=i.ProdId 


    DELETE B 
    FROM Basket B 
    INNER JOIN inserted i 
     ON i.ProdId = B.ProdId 
+0

Большое вам спасибо! Я всегда работаю с триггерами с одной строкой, и это меня очень сильно изменило. :) –

+1

Отлично, если это помогает! Однострочный код хорош, если вы гарантируете, что пользователь будет вставлять/обновлять только одну строку (которая используется во многих местах), но если у вас есть много строк, вставленных/обновленных, лучший способ использовать эти данные - присоединяйтесь к ней с тем, что вам нужно :) – gofr1

0

добавить ДЛЯ КАЖДОЙ ROW

DROP TRIGGER `TRG_Stock_Decrease`; 
DELIMITER // 

CREATE TRIGGER TRG_Stock_Decrease 
AFTER INSERT ON `TABLE` FOR EACH ROW 
BEGIN 
    DECLARE @ProdId INT; 
    DECLARE @SaleQuantity INT; 
    SELECT @ProdId=ProdId,@SaleQuantity=SaleQuantity FROM inserted; 
    UPDATE Product SET [email protected] WHERE [email protected]; 
    UPDATE Product SET ProdNoOfSold [email protected] WHERE [email protected]; 
    DELETE FROM Basket Where ProdId = @ProdId; 
END; // 

DELIMITER ; 
+0

Вопрос помечен' SQL Server' не 'Mysql' –

Смежные вопросы