2016-10-05 14 views
0

私は非常にCRUDベースの典型的なWebアプリケーションを持っています。特定の表または列が変更されると、その履歴情報を格納する必要があります。これは、例えば、新しい/古い列の値、タイムスタンプ、関連するテーブル、変更したユーザーの名前などを含むAUDITテーブルです。 Triggersを使用してこの情報を取得し、AUDIT表に保管します。SQL Server 2016の監査機能

ただし、これはSQL Serverの2016監査機能で自動的に達成できますか?いくつかの質問が私の頭に浮かんできます。 1)上の例のように、トリガーを使って監査データをデータベーステーブルに保存できますか? 2)は、データの読み取りを許可されたアプリケーションですか、または監査されたデータにアクセスするには特別な管理者の認証情報が必要ですか? 3)どの情報をログに記録する必要があるのか​​を指定することは可能ですか?

+0

このデータ*監査*または*履歴*の目的はありますか?歴史のために、新しいテンポラルテーブルの特徴を考慮する必要があるかもしれません。 –

+0

私は歴史と監査が同じものであると見る。ダミアンは、最良の方法は、時間的なテーブルを使用している提供するよう急所1)私たちは、おそらくテーブル構造を定義できるようにする必要があるということである、2)アプリケーションページは、履歴テーブルについて監査/一時テーブル – user1340582

+0

を照会できるようにする必要があります。http:/ SQL Serverの2016年に/www.kodyaz.com/sql-server-2016/create-sql-server-2016-temporal-table.aspx残念ながら、これらのテーブルは、 – Eralper

答えて

0

あなたはあなたのアプリケーションのユーザーがマップされている場合は、知っておく必要がありますどのようにlog sql table data changes using triggers呼ばチュートリアルここ

での例を見つけることができるデータベースのテーブル 上のデータの変更を追跡するためにトリガーを使用することができますUPDATE、DELETE、またはINSERTコマンドでは、テーブルのフィールド値として明示的にユーザー情報をinsertedby、updatedby、またはdeletedbyに渡す必要があります。そうでなければ、何を取得することは、あなたがテーブルに使用したり、履歴テーブルを作成するか、ログインする必要があり、すべてのトランザクション

だけトンemporal tables on SQL Server 2016のように同じユーザーになり、手動で

SQLトリガーコード

以下をご確認ください
CREATE TRIGGER dbo.LogTbl 
    ON dbo.Tbl 
AFTER INSERT, UPDATE, DELETE 
AS 

IF EXISTS (
    SELECT * FROM Inserted 
) -- INSERT or UPDATE 
BEGIN 
    IF EXISTS (
     SELECT * FROM Deleted 
    ) 
    -- UPDATE Statement was executed 
    INSERT INTO HistoryTbl (
    ... 
    UpdatedDate, 
    UpdatedByUserId 
) 
    SELECT 
    ... 
    i.UpdatedDate, 
    i.UpdatedByUserId 
    FROM Deleted d 
    INNER JOIN Inserted i ON i.Id = d.Id 

    ELSE 
    -- INSERT Statement was executed 
    INSERT INTO HistoryTbl (
    ... 
    InsertedDate, 
    InsertedByUserId 
) 
    SELECT 
    ... 
    i.InsertedDate, 
    i.InsertedByUserId 
    FROM Inserted i 

END 
ELSE 
    -- DELETE Statement was executed 
    INSERT INTO HistoryTbl (
    ... 
    DeletedDate, 
    DeletedByUserId 
) 
    SELECT 
    GETDATE(), ---!!! 
    USER_ID() ---!!! 
    FROM Deleted 

GO 

注意を払うには、コマンドを削除するには、[削除]コマンドで、我々はdeletedbyユーザデータを持っていません。 USER_ID()を使用してUSER_NAME()を使用することもできます。

行を削除する代わりに、ACTIVE列の値をfalseにUPDATEすることでDELETEできます。私は更新データを意味する、それはあなたがアクティブなフィールドを0に設定した、これはそれが削除されたと考えることができます。

アクティブなデータのみを選択してすべてのコードを変更する必要があります。

+0

はいトリガの変化を引き起こしたユーザ名が一つのアプローチではありません。そして、私は前にそれを使用しましたが、私たちは、このアウト・オブ・ボックスのためのSQL Server 2016個の機能を使用することができれば、今私が疑問に思いますか?トリガーは、あらゆる種類のパフォーマンスの問題や混乱を引き起こす可能性があります... – user1340582

関連する問題