2

重複の可能性:
SQL Server データ変更の監査

私の要件では、データベースに挿入および更新された各行が、誰が変更を行ったか (作成者/変更者)、いつレコードが作成され、いつ変更されたかを追跡する必要があります。すべてのテーブルに行 ID の GUID があるので、テーブルを考えてみようと思いましたrowdata

rowdata: created (datetime), modified (datetime), createdby(文字列またはユーザー ID)、場合modifiedbyによってsummaryは列 (文字列、変更の概要)

次に、いくつかの挿入/更新トリガーを配置します。あなたは大丈夫だと思いますか、それとも別のわがありますか(おそらくすぐに使えるもの)?

私の開発環境は .NET 4 です。他に問題になりそうなオプションがあれば教えてください。

4

2 に答える 2

4

トリガーは、この方法でテーブルを監査するための最も優れたオプションです。

于 2011-02-02T17:38:44.970 に答える
3

同様の要件がありますが、追跡する監査が必要なすべてのテーブルに次の 4 つの列を追加することで対応しました。

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

INSERT トリガーは次のようになります。

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 トリガーは次のようになります。

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 への接続に Windows 認証を使用しているため、使用に便利です。これはあなたのケースではうまくいかないかもしれません。

于 2011-02-02T18:00:04.390 に答える