【发布时间】:2016-10-18 09:04:42
【问题描述】:
我使用此 SQL Server 触发器从特定表中查找多条记录的插入/更新,并将其放入另一个队列表(供以后处理)。
ALTER TRIGGER [dbo].[IC_ProductUpdate] ON [dbo].[StockItem]
AFTER INSERT, UPDATE
AS
BEGIN
SELECT RowNum = ROW_NUMBER() OVER(ORDER BY ItemID) , ItemID
INTO #ProductUpdates
FROM INSERTED;
DECLARE @MaxRownum INT;
SET @MaxRownum = (SELECT MAX(RowNum) FROM #ProductUpdates);
DECLARE @Iter INT;
SET @Iter = (SELECT MIN(RowNum) FROM #ProductUpdates);
WHILE @Iter <= @MaxRownum
BEGIN
-- Get Product Id
DECLARE @StockItemID INT = (SELECT ItemID FROM #ProductUpdates WHERE RowNum = @Iter);
-- Proceed If This Product Is Sync-able
IF (dbo.IC_CanSyncProduct(@StockItemID) = 1)
BEGIN
-- Check If There Is A [ProductUpdate] Queue Entry Already Exist For This Product
IF ((SELECT COUNT(*) FROM IC_ProductUpdateQueue WHERE StockItemID = @StockItemID) > 0)
BEGIN
-- Reset [ProductUpdate] Queue Entry
UPDATE IC_ProductUpdateQueue
SET Synced = 0
WHERE StockItemID = @StockItemID
END
ELSE
BEGIN
-- Insert [ProductUpdate] Queue Entry
INSERT INTO IC_ProductUpdateQueue (StockItemID, Synced)
VALUES (@StockItemID, 0)
END
END
SET @Iter = @Iter + 1;
END
DROP TABLE #ProductUpdates;
END
这很好用,但是我只希望上面的触发器在某些列被更新时做出反应。
我感兴趣的栏目是:
- 姓名
- 说明
我知道我可以使用以下 T-SQL 语法来检查列是否真的更新(在更新事件期间),如下所示:
IF (UPDATE(Name) OR UPDATE(Description))
BEGIN
// do something...
END
但是,我不确定如何将其合并到上述触发器中,因为我的触发器也处理同时更新的多行。
有什么想法吗?在触发器的哪个点我可以使用IF (UPDATE(colX))?
【问题讨论】:
标签: sql sql-server triggers