10

製品の在庫レベルが保持されるWarehouseItemというテーブルを含むデータベースがあります。このテーブルがいつ更新されるかを知る必要があるため、更新されたこのテーブル行の主キーを配置するトリガーを作成しました。別のテーブルに(キューシステムのように)。

これは私のトリガーです:

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」テーブルで 1 つの行だけが更新された場合、問題なく機能します。ただし、このテーブルで複数の行が更新されている場合、トリガーはそれを処理できません。

ここに画像の説明を入力

大量更新イベントの後に「挿入された」コレクションを反復処理する方法はありますか? または、トリガーで複数の行の更新をどのように処理しますか?

4

3 に答える 3

3

これを使用します:

-- Get Product Id
DECLARE @StockItemID INT = (SELECT ItemID FROM INSERTED);
DECLARE @WarehouseID INT = (SELECT WarehouseID FROM INSERTED);

ただし、(サンプルとして) 複数の行を更新する場合は、別の戦略を使用する必要があります。

たとえば、変数を宣言する代わりに、変数を使用するクエリの JOIN で INSERTED テーブルを使用します。

IFステートメントは変数で機能しますが、その条件をクエリに移動すると思います。

この方法で UPDATE クエリを変更してみてください (最終的に IF の条件を追加します)。

-- Reset [StockUpdate] Queue Entry
UPDATE IC_StockUpdateQueue SET Synced = 0
FROM inserted 
WHERE inserted.itemID = StockItemID;

等々。

詳細については、コメントを追加してください。

于 2013-09-09T10:28:26.277 に答える