您可以使用sys.fn_dblog
读取事务日志。下面的例子。
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')
For a delete
and insert
IIRC行动[RowLog Contents 0]
包含插入和删除的整行。更新有点复杂,因为只能记录部分行。
要解码此行格式,您需要了解行在 SQL Server 内部的存储方式。这本书Microsoft SQL Server 2008 内部结构对此进行了一些详细介绍。您还可以下载SQL Server 内部查看器在这方面提供帮助(我相信源代码马克·拉斯姆森's Orca MDF也可用,大概有一些代码来解码内部行格式)。
有关在 TSQL 中执行此操作的示例,请参阅这篇博文这表明只要项目的目标有限,就完全有可能从日志中提取有用的信息。不过,编写一个完整的日志读取器来应对对象中的架构更改以及稀疏列(以及下一版本中的列存储索引)等内容可能会是一项艰巨的工作。