sql >> Base de Datos >  >> RDS >> Sqlserver

Leer el registro de transacciones de SQL Server

Puede usar sys.fn_dblog para leer el registro de transacciones. Ejemplo a continuación.

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') 

Para un delete y insert operación IIRC el [RowLog Contents 0] contiene toda la fila insertada y eliminada. Las actualizaciones son un poco más complicadas porque solo se puede registrar una fila parcial.

Para decodificar este formato de fila, debe comprender cómo se almacenan internamente las filas en SQL Server. El libro Microsoft SQL Server 2008 Internals cubre esto con cierto detalle. También puede descargar el SQL Server Internals Viewer para ayudar en este sentido (Y creo que el código fuente de Mark Rasmussen Orca MDF también está disponible, que presumiblemente tiene algún código para decodificar el formato de fila interno).

Para ver un ejemplo de cómo hacer esto en TSQL, consulte esta entrada de blog lo que demuestra que es perfectamente posible extraer información útil del registro siempre que el objetivo del proyecto sea limitado. Sin embargo, escribir un lector de registro completo que pueda hacer frente a los cambios de esquema en los objetos y cosas como columnas dispersas (e índices de almacenamiento de columnas en la próxima versión) sería una gran cantidad de trabajo.