2014-09-11 1 views
1

У меня есть таблица dbo.Warehouse, которая содержит ProductID и количество и таблицу dbo.Orders, которая содержит Заказы, сделанные для каждого продукта и т. Д. Я создал триггер, который обновит таблицу Warehouse, когда новая запись будет вставлен в таблицу заказов, Однако проблема заключается в том, что при вставке новых записей все записи обновляются, а не только 1, что является новым, в основном, если у меня уже есть 2 предыдущих заказа, размещенных для ProductID 3 и 2 Orders уже размещенные для ProductID 2, не только обновленные (вычитаемые) значения ProductID 3, но также и те, которые ранее были вычтены, ProductID 2, пожалуйста, сообщите, что я могу сделать с моим кодом, чтобы сделать эту работу, спасибо.Как обновить запись в таблице, используя вычитание, когда другая таблица получает вставленную запись?

ALTER TRIGGER Trg_AI_UpdateQty ON dbo.Orders 
AFTER INSERT 
AS 


IF EXISTS (SELECT A.ProductID, A.Qty 
     FROM dbo.Warehouse AS A 
     INNER JOIN dbo.Orders AS B ON A.ProductID = B.ProductID 
     WHERE B.OrderQty > A.Qty 
     ) 

BEGIN 
RAISERROR ('You do not have enough Products in stock, please order more', 1, 1) 
END 

ELSE 

BEGIN 

UPDATE B 
SET B.Qty = (B.Qty - A.OrderQty) 
FROM dbo.Orders AS A 
INNER JOIN dbo.Warehouse AS B ON A.ProductID = B.ProductID 
WHERE A.ProductID = B.ProductID 

END 

ответ

1

Вам нужно зарегистрироваться на вставленную таблице не основную таблицу триггер на SO:

Здесь больше информации о специальных удаленных и вставленных таблицах

http://msdn.microsoft.com/en-us/library/ms191300.aspx

ALTER TRIGGER Trg_AI_UpdateQty ON dbo.Orders 
AFTER INSERT 
AS 


IF EXISTS (SELECT A.ProductID, A.Qty 
     FROM dbo.Warehouse AS A 
     INNER JOIN inserted AS B ON A.ProductID = B.ProductID 
     WHERE B.OrderQty > A.Qty 
     ) 

BEGIN 
RAISERROR ('You do not have enough Products in stock, please order more', 1, 1) 
END 

ELSE 

BEGIN 

UPDATE B 
SET B.Qty = (B.Qty - A.OrderQty) 
FROM inserted AS A 
INNER JOIN dbo.Warehouse AS B ON A.ProductID = B.ProductID 
WHERE A.ProductID = B.ProductID 

END 
+0

О господи, тупые me..I следовало подумать вставленной таблицы :(спасибо мельницу Gratzy !!! это оценено. – Claudio

0

Попробуйте это

ALTER TRIGGER Trg_AI_UpdateQty ON dbo.Orders 
AFTER INSERT 
AS 
IF EXISTS (SELECT 1 
     FROM dbo.Warehouse AS A 
     INNER JOIN inserted AS B ON A.ProductID = B.ProductID 
     WHERE B.OrderQty > A.Qty) 
BEGIN 
RAISERROR ('You do not have enough Products in stock, please order more', 1, 1) 
END 
ELSE 
BEGIN 
UPDATE B 
SET B.Qty = (B.Qty - A.OrderQty) 
FROM inserted AS A 
INNER JOIN dbo.Warehouse AS B ON A.ProductID = B.ProductID 
WHERE A.ProductID = B.ProductID 
END 

На стороне записки пытаются select 1 при использовании if exists

+0

Спасибо R.T. буду помнить :), я предполагаю, что это связано с производительностью? – Claudio

+0

@Claudio: - Да, что поможет в производительности :) –

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