2009-05-15 10 views
8

SQLデータの変更を監査することについて、SOFで1週間ほど前に質問しました。 SQL Server 2008にはCDCの言及もありました。変更を行ったSQL Server 2008変更データキャプチャ?

私は今日これを試してきましたが、これまでに非常にうまくいきました。誰が実際に変更を行ったのかを追跡します。誰が声明を出したのですか?

誰かが監査のためにCDCを使用していて、誰が変更を行ったのかを把握しているかどうかを知りたいですか?

+1

どうすればこの問題を解決できましたか? –

答えて

1

CDC本当に監査のために設計されていません。監査機能を探している場合は、SQL Server Auditを使用する必要があります。

+0

それは厳密には当てはまりません。 CDCはデータウェアハウスのようなものに使用されていることを理解していますが、CDCを使用してトリガを使用する非同期の代替方法としてデータの変更を監査することができます。同意しても、このために設計されたものではありません。 – MrEdmundo

+2

SQL Server Auditは、Before&After値をキャプチャしません。 MSは2つのアプローチ(CDCとSSA)の実装の手間を経て、完全に監査の変更の問題を解決していないことに気付いています。 – tbone

+0

@tbone私は実際には3つの方法があると思います。 CDC、監査、および変更の追跡。現在のところ、CDCを使用している良い前後の監査システムと、(SQL Serverユーザーを使用していないため)アプリケーションによってCONTEXT_INFOにユーザーが移入された単純なトリガーが混在するように設計されています。 – GilesDMiddleton

0

理想的ではありませんが、一般的な合意は、誰が変更を行ったのかをキャプチャしないことが一般的なコンセンサスのようですが、誰が変更をトリガしたかを見るために使用できるCreatedBy/DateおよびUpdatedBy/Date列を実装しました。もちろん、それを動作させるには、行を更新しているSPまたはSQL文が、それぞれ、suser_name()およびgetDate()を使用して、UpdatedBy/Dateフィールドを明示的に設定する必要があります。私はこれが箱から出てうれしいことに同意します。これはCDCが何かをすることを意味するものではありませんが、CDCを使用して従来のトリガーを使用する代わりにデータの変更を非同期で監査しようとしています。

+0

私たちは現在、監査追跡のためにCDCを使用しています。これが私たちが行ったアプローチです。各テーブルに監査ユーザーID列を追加し、ストアドプロシージャを変更してその列を更新しました。最も優れた解決策ではないかもしれませんが、機能します。 – MrDustpan

1

MrEdmundo、CDCは私の意見ではプライムタイムの準備ができていません。現在、CDCを有効にしてVisual Studioからデータベースプロジェクトをデプロイするのはかなり難しいようです(DDLの変更は嫌です)。さらに、CDCにはデータの終わりのクリーンアッププロシージャが組み込まれているようですので、長期間にわたり監査履歴を維持することが実際には難しい場合があります。また

など、変更の追跡を私が誤解している場合、私を修正し、SQLの監査は、このような障害が発生したログインとしてSQL Serverで発生するイベントの茄多を監査するために連動になると思われる、DDLの変更DMLではなくDDLのみであるため、運が悪いです。

テーブルから更新済みまたは削除済みの古いレコードをキャプチャするのが本当であれば、dbo.TableNameでAudit.TableNameとupdate + deleteトリガを作成するのが最良の答えです。また、TableNameにCreatedBy DEFAULT SUSER、CreatedDate DEFAULT getdate()、ModifiedBy、ModifiedDateの列が含まれていることを確認してください。

6

私が直接使用してCDCテーブルを変更: ALTER TABLE cdc.dbo_MyTable_CTは、ユーザー名のデータ型はnvarchar(50)は、NULL DEFAULT(SUSER_SNAMEを())ADD

を、それはすでにありますので、ところであなたは、日付情報を必要としません開始LSNフィールドと終了LSNフィールド

私の唯一の問題は、ユーザーがWindowsグループを使用してログインして権限を変更できることですが、UserNameフィールドは常に自分のユーザー名であり、ユーザー名ではありません。私はこの問題を回避する方法を見出していない。ここで

+0

時刻がcdc.lsn_time_mappingテーブルにある – Satfactor

+0

これは動作していないようです - 別のログインからUPDATEを実行すると "sa"が表示されます –

0

は、いくつかの自動化されたプロセスを介して作成することができますまたはCDCは、その特定のテーブルの上に有効になっている場合、手動で、このトリガーは、問題を解決するトリガーであること変更が行われた場所から &

CREATE TRIGGER TR_TABLENAME_CDC 
ON TABLENAME 
FOR INSERT, UPDATE, DELETE 
AS 
DECLARE   
     @SessionID int, 
     @AppName nvarchar(255), 
     @HostName nvarchar(255), 
     @UserName nvarchar(32) 
BEGIN 
    SELECT @[email protected]@SPID 
    SELECT @AppName=program_name, @HostName=host_name from sys.dm_exec_sessions where session_id = @SessionID 

    IF(@AppName = 'BLAH BLAH' OR @AppName = 'XYZ' OR @AppName = 'ABC') 
    BEGIN 
     SELECT @UserName=login_name from sys.dm_exec_sessions where session_id = @SessionID 
     INSERT INTO UserDetail (SessionID, AppName, HostName, UserName) VALUES (@SessionID, @AppName, @HostName, @UserName) 
    END 
END 
5

変更データキャプチャは、ユーザー、変更を行ったマシン、または変更の時刻を追跡しません。

CDCで変更を行ったユーザーを追跡する最適なソリューションは、各変更時に更新されるユーザーの詳細を格納する新しいフィールドを作成することです(アイデアhere)。

同じシリーズの別の記事では、すぐに使用できるソリューションを提供するサードパーティのツールが紹介されています。私はまだプロセスを評価していますが、それは今のところかなり良いようです。 this sequelの末尾にある便利なテーブルに、追跡された情報の比較が表示されます。

これが役に立ちます。

+0

"ユーザーを保存する新しいフィールドを作成する詳細は、各変更時に更新されます。これは上の答えのようですか?ユーザーの詳細はどこから来ますか? –

関連する問題