sys.fn_dblog
を使用すると、トランザクションログを読み取ることができます。以下の例。 delete
とinsert
動作について
SELECT [RowLog Contents 0],
[RowLog Contents 1],
[Current LSN],
Operation,
Context,
[Transaction ID],
AllocUnitId,
AllocUnitName,
[Page ID],
[Slot ID]
FROM sys.fn_dblog(NULL,NULL)
WHERE Context IN ('LCX_MARK_AS_GHOST', 'LCX_HEAP', 'LCX_CLUSTERED')
AND Operation IN ('LOP_DELETE_ROWS', 'LOP_INSERT_ROWS')
IIRC [RowLog Contents 0]
は、行全体を挿入、削除が含まれています。更新は、一部の行のみをログに記録できるという点で少し複雑です。
この行形式をデコードするには、行がSQL Serverの内部でどのように格納されているかを理解する必要があります。本書Microsoft SQL Server 2008 Internalsでこれについて詳しく説明しています。この点については、SQL Server Internals Viewerをダウンロードすることもできます(Mark RasmussenのOrca MDFのソースコードも利用可能ですが、おそらく内部の行形式をデコードするコードがあると思います)。
TSQLでこれを行う例については、this blog postを参照してください。これは、プロジェクトの目的が限定されている限り、ログから有用な情報を完全に抽出できることを示しています。オブジェクトのスキーマの変更やスパース列(次のバージョンでは列ストアのインデックス)のようなものに対処できる完全なログリーダーを書くことは、おそらく膨大な作業になるでしょう。トランザクションレコード列をログquery..where以上使用して、すべての関連情報を取得
[SQL Serverトランザクションログエクスプローラ/アナライザ]の複製が可能です。(http://stackoverflow.com/questions/3789443/sql-server-transaction-log-explorer-analyzer) –