У нас есть база данных с таблицей WarehouseItem, где хранятся уровни запасов продукта. Мне нужно знать, когда эта таблица будет обновлена, поэтому я создал триггер, чтобы перенести первичный ключ этой строки таблицы, которая была обновлена; в отдельную таблицу (например, систему очереди).Обработка нескольких строк в триггере SQL Server
Это мой триггер:
IF ((SELECT COUNT(*) FROM sys.triggers WHERE name = 'IC_StockUpdate') > 0)
DROP TRIGGER [dbo].[IC_StockUpdate]
GO
CREATE TRIGGER [dbo].[IC_StockUpdate] ON [dbo].[WarehouseItem]
AFTER UPDATE
AS
BEGIN
-- Get Product Id
DECLARE @StockItemID INT = (SELECT ItemID FROM INSERTED);
DECLARE @WarehouseID INT = (SELECT WarehouseID FROM INSERTED);
-- Proceed If This Product Is Syncable
IF (dbo.IC_CanSyncProduct(@StockItemID) = 1)
BEGIN
-- Proceed If This Warehouse Is Syncable
IF (dbo.IC_CanSyncStock(@WarehouseID) = 1)
BEGIN
-- Check If Product Is Synced
IF ((SELECT COUNT(*) FROM IC_ProductCreateQueue WHERE StockItemID = @StockItemID) > 0)
BEGIN
-- Check If Stock Update Queue Entry Already Exists
IF ((SELECT COUNT(*) FROM IC_StockUpdateQueue WHERE StockItemID = @StockItemID) > 0)
BEGIN
-- Reset [StockUpdate] Queue Entry
UPDATE IC_StockUpdateQueue SET Synced = 0
WHERE StockItemID = @StockItemID;
END
ELSE
BEGIN
-- Insert [StockUpdate] Queue Entry
INSERT INTO IC_StockUpdateQueue (StockItemID, Synced) VALUES
(@StockItemID, 0);
END
END
ELSE
BEGIN
-- Insert [ProductCreate] Queue Entry
INSERT INTO IC_ProductCreateQueue (StockItemID, Synced) VALUES
(@StockItemID, 0);
-- Insert [StockUpdate] Queue Entry
INSERT INTO IC_StockUpdateQueue (StockItemID, Synced) VALUES
(@StockItemID, 0);
END
END
END
END
GO
Это отлично работает, если только одна строка обновляется в таблице «WarehouseItem». Однако, если более чем один ряд обновляется в этой таблице, мой триггер не в состоянии справиться с этим:
Есть ли способ для перебора «вставленной» коллекции после события массового обновления? Или как обрабатывать несколько обновлений строк в триггере?
Следуя обеспечивает хорошее объяснение Резо e проблема, https: //www.mssqltips.com/sqlservertip/2342/understanding-sql-server-inserted-and-deleted-tables-for-dml-triggers/ Я использовал следующие условия для захвата вставки, удаления и обновления SELECT @ DELCOUNT = COUNT (*) FROM DELETED \t SELECT @ INSCOUNT = COUNT (*) FROM INSERTED IF @ DELCOUNT = 0 - INSERT, ELSE IF @INSCOUNT = 0 - DELETE и т. Д. – Buminda