2011-02-02 12 views
2

可能性の重複:
Auditing SQL Server data changes変更の追跡(SQL Serverなど)

各行のための私の要件の需要は、変更を行った者の追跡データベースに挿入され、更新(作成者/修飾子)、レコードの作成時および変更時。私はすべてのテーブルの行IDのGUIDを持っているので、私は、私は、テーブルにrowdata

rowdataを考え出すだろうと思った:created (datetime)modified (datetime)createdby(文字列またはユーザID)、modifiedbyと多分summary列(文字列、変更点の概要)

を挿入して、挿入/更新トリガーを挿入します。あなたは大丈夫だと思いますか、それとも別のWAがありますか?

私の開発環境は.NET 4です。問題になる可能性のある他のオプションについて考えてみてください。

+0

SQL Server 2008の監査機能を使用する - 重複する質問と回答を参照 –

答えて

3

私は同様の要件を持っていますが、監査追跡に必要なすべてのテーブルにこれらの4つの列を追加することによって、それについて行きました:

CREATE TRIGGER [SomeSchema].[Some_Table_Insert_Create] ON [SomeSchema].[Some_Table] FOR INSERT AS 
    SET NOCOUNT ON 

    IF EXISTS(SELECT * FROM INSERTED WHERE Create_User IS NOT NULL) 
     BEGIN 
     UPDATE [SomeSchema].[Some_Table] SET 
      Create_Date = SYSDATETIMEOFFSET() 
     FROM 
      [SomeSchema].[Some_Table] 
     INNER JOIN 
      INSERTED 
     ON 
      [SomeSchema].[Some_Table].Some_Table_Id = INSERTED.Some_Table_Id 
     END 
    ELSE 
     BEGIN 
     UPDATE [SomeSchema].[Some_Table] SET 
      Create_User = SUSER_SNAME(), 
      Create_Date = SYSDATETIMEOFFSET() 
     FROM 
      [SomeSchema].[Some_Table] 
     INNER JOIN 
      INSERTED 
     ON 
      [SomeSchema].[Some_Table].Some_Table_Id = INSERTED.Some_Table_Id 
     END 

そしてUPDATE:INSERTトリガーがどのように見える

[Create_User] [nvarchar](100) NULL, 
[Create_Date] [datetimeoffset](7) NULL, 
[Modify_User] [nvarchar](100) NULL, 
[Modify_Date] [datetimeoffset](7) NULL, 

をトリガーは次のようになります:

CREATE TRIGGER [SomeSchema].[Some_Table_Update_Modify] ON [SomeSchema].[Some_Table] FOR UPDATE AS 

    SET NOCOUNT ON 

    IF NOT UPDATE (Create_User) AND NOT UPDATE (Create_Date) 
     BEGIN 
     IF EXISTS(SELECT * FROM INSERTED WHERE Modify_User IS NOT NULL) 
      BEGIN 
       UPDATE [SomeSchema].[Some_Table] SET 
        Modify_Date = SYSDATETIMEOFFSET() 
       FROM 
        [SomeSchema].[Some_Table] 
       INNER JOIN 
        INSERTED 
       ON 
        [SomeSchema].[Some_Table].Some_Table_Id = INSERTED.Some_Table_Id 
      END 
     ELSE 
      BEGIN 
       UPDATE [SomeSchema].[Some_Table] SET 
        Modify_User = SUSER_SNAME(), 
        Modify_Date = SYSDATETIMEOFFSET() 
       FROM 
        [SomeSchema].[Some_Table] 
       INNER JOIN 
        INSERTED 
       ON 
        [SomeSchema].[Some_Table].Some_Table_Id = INSERTED.Some_Table_Id 
      END 
     END 

SUSER_SNAME()関数は便利ですなぜなら私たちはアプリとウィンドウ認証で偽装を使用してDBに接続しているからです。あなたのケースではこれはうまくいかないかもしれません。

4

実際、この方法でテーブルを監査するには、トリガーが最も優れています。

関連する問題