少なくとも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を使用すべき特定の理由はありますか?
これは、 'Inserted'テーブルと' Deleted'テーブルに、トリガを起動したクエリによって変更されたデータとは異なるデータが既に含まれている可能性があることを意味しますか? – Naucle
あなたはまた、同じレコードの複数の更新をどのように扱うのか、ユーザーごとに更新の履歴を作成する方法を検討する必要があります。更新日などの位置を含めることができます。CDC内でこの監査を達成する多くの方法がありますデータのキャプチャ)をSSISを使用して、私はあなたがブラウズするための例を貼り付けました。お役に立てれば。 https://docs.microsoft.com/en-us/sql/integration-services/change-data-capture/change-data-capture-ssis – jimmy8ball
私の理解では、すべてのDELETEクエリは独自の 'Deleted'テーブルを生成します。上記のクエリで削除された行が含まれているため、トリガは、トリガで行ったテストで確認されたIDをJOINすることなく、どこを見るかを正確に認識します。あなたのポイントを説明する例を提供できますか?また、私は既にCDCを試みましたが、問題は、変更をコミットしたユーザーを追跡する方法がないことです。 – Naucle