2010-12-20 14 views
3

に2列を引き起こしています。追跡されたレコードは、監査テーブル(aAudit)に挿入されます。 Aで更新プログラムを実行すると、各更新プログラムの監査テーブルに2つの行が表示されていますが、これは私が期待するものではありません。ここで私が定義したトリガーである:SQLの更新クエリは、私はSQL Server 2005を使用して、以下の質問があり、トリガー

ALTER TRIGGER [ATrigger] ON [dbo].[A] 
FOR INSERT, UPDATE, DELETE 
AS 
INSERT INTO [dbo].[aAudit] 
([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus]) 
SELECT [BusinessDate], [DataTypeId], [BookId], [Version], 'N', getDate(), 0 
FROM inserted 

INSERT INTO [dbo].[aAudit] 
([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus]) 
SELECT [BusinessDate], [DataTypeId], [BookId], [Version], 'Y', getDate(), 0 
FROM deleted 

なぜ監査テーブル内DelFlag = 'Y'DelFalg = 'N'と一列と一列に得られる上記トリガがありますか?

私の質問を見ていただきありがとうございます。舞台裏

ビクラム

答えて

4

、INSERTの3つの操作を分離UPDATE、DELETEするために、あなたは追加のチェックを実行する必要があります。上

ALTER TRIGGER [ATrigger] ON [dbo].[A] 
FOR INSERT, UPDATE, DELETE 
AS 
    -- those are true INSERTs - the (ID) as primary key is *not* present in the "Deleted" table 
    INSERT INTO [dbo].[aAudit]([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus]) 
     SELECT [BusinessDate], [DataTypeId], [BookId], [Version], 'N', getDate(), 0 
     FROM inserted 
     WHERE (id) NOT IN (SELECT DISTINCT (id) FROM DELETED) 

    -- those are true DELETEs - the (ID) as primary key is *not* present in the "Inserted" table 
    INSERT INTO [dbo].[aAudit]([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus]) 
     SELECT [BusinessDate], [DataTypeId], [BookId], [Version], 'Y', getDate(), 0 
     FROM deleted 
     WHERE (id) NOT IN (SELECT DISTINCT (id) FROM INSERTED) 

    -- those are the UPDATEs - the (ID) as primary key is present in both the "Inserted" and "Deleted" table 
    INSERT INTO [dbo].[aAudit]([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus]) 
     SELECT [BusinessDate], [DataTypeId], [BookId], [Version], 'N', getDate(), 0 
     FROM Inserted i 
     INNER JOIN Deleted d on i.ID = d.ID 
+0

多くのおかげで、私の問題は解決します:) – Vikram

+0

@Vikram - それから答え。これにより、人々があなたを援助し、どの回答が問題を修正したかを他の検索者に知らせることができます – JNK

6

、UPDATEは古い行を削除し、新しい行を挿入として扱われます。したがって、更新を行うと、INSERTEDとDELETEDの両方のレコードセットにデータが含まれます。

これで、UPDATEステートメントから監査テーブルに2つの行が追加されています。

+0

+1スポット - UPDATEはそれがある場合は/コンボ操作 –

+0

をDELETE、INSERTとして扱われます場合は、それを処理する方法ですか?私は任意の挿入/更新が "削除されていない"と削除された行を "削除済み"として監査テーブルに移動します。 – Vikram

+0

@Vikram:はい、できます - トリガーでもう少しチェックが必要です - 詳細は私の回答をご覧ください –