2016-08-11 7 views
1

Quantity列のInventoryOnHandテーブルがあります。ロジックに基づいて適切なテーブルのSQL Serverでトリガーを作成する

InventoryTransactionレコードがINSERTEDの場合、InventoryOnHandテーブルのQuantityを更新する必要があります。

誰かが次のように説明していただけます。

  1. トリガーはInventoryOnHandテーブルまたはInventoryTransactionテーブルに作成する必要がありますか? InventoryTransactionテーブルは 'INSERTED'なので、

  2. トリガーに名前を付けるときは、tablenameに更新されたテーブルまたはトリガーが適用された実際のテーブルを使用する必要がありますか?例:ここではtr_InventoryTransactionIns

は私が持っているものです:

CREATE TRIGGER dbo.tr_InventoryTransactionIns 
    ON dbo.Inventory 
    AFTER INSERT 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for trigger here 
    UPDATE Inventory SET QuantityOnHand = QuantityOnHand + INSERTED.Quantity 
END 
GO 
+1

**(1)**:はい、トリガーアクションが* *トリガが発生する原因となるテーブルの上になければなりません。データが 'InventoryTransaction'テーブルに挿入されたときにトリガを起動したいので、トリガ**はこのテーブルで**でなければなりません。 **(2)**:それはあなたとあなたの命名規則に完全に従う - 「受け入れられた」ベストプラクティスまたは一般的に受け入れられているコンベンションはここにない - あなたのチーム/会社のために何かを定義してそれに固執する –

+0

@marc_s last last質問。どのような場合、複数のレコードがINSERTEDテーブルと単一レコードかになりますか?私は、コードがSELECT INSERTを行う場合、複数のものがあると仮定しようとしています。しかし、それは単にそれぞれのループのために行い、それぞれが個々の権利であるたびにデータベース呼び出しを行うのであれば? –

+1

'Inserted'テーブルに複数の行がある可能性を考慮し、対処する必要があります。私の応答を参照してください。これは、単一のUPDATE文でこれを処理するための適切な**集合ベース**アプローチを使用します。 ***あなたは***決してループやカーソルをトリガーの中に入れてはいけません。それはあなたのシステムでのパフォーマンスの死であろう! –

答えて

2

あなたはまた、何とかリンク行はあなたがInventoryテーブルに更新している行に挿入されている必要があります - 今すぐ更新中全体Inventoryテーブル!

このような何かを試してみてください:

CREATE TRIGGER dbo.tr_InventoryTransactionIns 
ON dbo.InventoryTransaction 
AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    UPDATE inv 
    SET QuantityOnHand = QuantityOnHand + INSERTED.Quantity 
    FROM Inventory inv 
    INNER JOIN Inserted ins ON inv.InventoryId = ins.InventoryId 
END 
GO 
+0

良いキャッチ私はInventoryIdを使うのを忘れていたとは思いません。あなたがあなたの投稿を更新したいのであれば、それはinv.QuantityOnHand + INSERTED.Quantityとinv.Id = ins.InventoryIである必要があると思います。 where節を持つ通常の更新文ではなく、INNER JOINを実行する特定の理由はありますか? –

+1

INNER JOINはsql-92(SQLの最新バージョン)ですが、WHEREは古いバージョンです。機能的にはそれらは同じです(結合述部を定義する場合) –

関連する問題