2017-04-18 15 views
0

少なくとも2人以上のユーザーが同時に使用できるSQL Server 2012データベースと通信する単純なVB NET/WPFアプリケーションを作成しています。トリガーベースのSQL Server監査

データベースのすべての変更(INSERT/UPDATE/DELETE)を追跡するために、単純にトリガベースの監査システムを実装しています。明らかに、更新/削除/挿入されるデータはすべて対応する監査表を作成し、ユーザーおよび操作の日時を記録します。

私は明らかに検索中にたくさんのガイドを見つけました。しかし、これらのSQL Serverのほとんどのガイドでは、クエリでJOINを使用してInsertedまたはDeletedテーブルに格納されたデータを抽出することに気付きましたが、JOINなしで同じ結果が得られました。

Exemple:

  • マイINSERTトリガー:

    CREATE TRIGGER [HumanResources].[after_insert_humanresources_shift] 
    ON [HumanResources].[Shift] 
    AFTER INSERT 
    AS 
    BEGIN 
    INSERT INTO [HumanResources].[Shift_Audit] 
    (
        -- [EventID], [EventBy] and [EventOn] have autovalues 
        [EventType], 
        [ShiftID], 
        [Name], 
        [StartTime], 
        [EndTime], 
        [ModifiedDate] 
    ) 
    SELECT 
        'INSERT', 
        [ShiftID], 
        [Name], 
        [StartTime], 
        [EndTime], 
        [ModifiedDate] 
    FROM 
        [Inserted] 
    END 
    
  • This guide's INSERTトリガー:

    create trigger tblTriggerAuditRecord on tblOrders 
    after insert 
    as 
    begin 
        insert into tblOrdersAudit 
        (OrderID, OrderApprovalDateTime, OrderStatus, UpdatedBy, UpdatedOn) 
        select i.OrderID, i.OrderApprovalDateTime, i.OrderStatus, SUSER_SNAME(), getdate() 
        from tblOrders t 
        inner join inserted i on t.OrderID=i.OrderID 
    end 
    

はDELETEマイおよびUPDATEトリガがまったく同じTHIを行いますng。これらはすべて、単一のD/U/Iクエリまたは複数のクエリ(たとえば、単一のクエリでの複数の更新)の両方で機能します。私がJOINを使用すべき特定の理由はありますか?

答えて

1

はい「内部結合はiをt.OrderID = i.OrderIDに挿入しました」は注文テーブルの依存関係をチェックし、注文テーブルに本物の注文がある場合はレコードのみを挿入し、独立したテーブルに挿入するとエンティティレベルでの依存関係のデータ。助けてくれることを望む。

+0

これは、 'Inserted'テーブルと' Deleted'テーブルに、トリガを起動したクエリによって変更されたデータとは異なるデータが既に含まれている可能性があることを意味しますか? – Naucle

+0

あなたはまた、同じレコードの複数の更新をどのように扱うのか、ユーザーごとに更新の履歴を作成する方法を検討する必要があります。更新日などの位置を含めることができます。CDC内でこの監査を達成する多くの方法がありますデータのキャプチャ)をSSISを使用して、私はあなたがブラウズするための例を貼り付けました。お役に立てれば。 https://docs.microsoft.com/en-us/sql/integration-services/change-data-capture/change-data-capture-ssis – jimmy8ball

+0

私の理解では、すべてのDELETEクエリは独自の 'Deleted'テーブルを生成します。上記のクエリで削除された行が含まれているため、トリガは、トリガで行ったテストで確認されたIDをJOINすることなく、どこを見るかを正確に認識します。あなたのポイントを説明する例を提供できますか?また、私は既にCDCを試みましたが、問題は、変更をコミットしたユーザーを追跡する方法がないことです。 – Naucle

関連する問題