Change Data Capture


SQL SERVER2008からの新機能。
INSERT、UPDATE、DELETEステートメントの更新履歴を保管しておく機能。
これにより指定した時間の過去のデータを参照したり、データを回復したりできる。
OracleのFlashBack Query(Total Recallともいう)のようなもの。




●設定手順


1.SQL Agent サービスを有効にする。


2.sp_cdc_enable_dbでCDCを有効にする。

USE harada_lab			--データベース名
EXEC sp_cdc_enable_db


3.sp_cdc_enable_tableでCDCを有効にするテーブルを指定する。

EXEC sp_cdc_enable_table
 @source_schema = N'dbo'
,@source_name = N'customer'			--テーブル名
,@@role_name= N'cdc_Admin'


4.CDCを有効にすると「テーブル名_CT」でテーブルが作成される。
このテーブルをSELECTすることで実行したSQLを参照できる。


5.時間指定による過去データの参照は以下の通り

--照会したいログの期間を指定
DECLARE @begin_time datetime = '2011-02-22 00:00:00.000' 
DECLARE @end_time datetime = '2011-02-22 13:46:00.000' 

DECLARE @from_lsn binary(10), 
              @to_lsn binary(10) 

-- fn_cdc_map_time_to_lsn 関数で時間からログ番号を取得
SELECT @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time) 
SELECT @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time) 

-- fn_cdc_get_all_changes_dbo_customerで値を取得 (spのhogeの部分はテーブル名)
SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_hoge(@from_lsn, @to_lsn, 'all')

また、Change Data Captureを有効にするとcdc.dbo_テーブル名_CTというテーブルが作成されるので、その中身をSELECT することで変更の履歴を照会することもできる。

SELECT * FROM cdc.dbo_hoge_CT 

詳しくは以下のサイトでダウンロードできるPDFを参照。

http://www.microsoft.com/downloads/details.aspx?FamilyId=EF52E9A0-2581-4ADF-BAA6-0ADC14273A65&displaylang=ja

※1.動作確認をしようと思ったのだが、Express EditionではSQL Agent サービスが
 サポートされていないようなので未検証。


※2.ということでExpress Editionではこの機能は使用できないっぽい。


※3.EnterPrise Editionで動作検証済み (2011/2/2)