Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Ler o log de transações do SQL Server


Você pode usar sys.fn_dblog para ler o log de transações. Exemplo abaixo.
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 um delete e insert operação IIRC o [RowLog Contents 0] contém toda a linha inserida e excluída. As atualizações são um pouco mais complicadas, pois apenas uma linha parcial pode ser registrada.

Para decodificar esse formato de linha, você precisa entender como as linhas são armazenadas internamente no SQL Server. O livro Microsoft SQL Server 2008 Internals aborda isso com algum detalhe. Você também pode baixar o SQL Server Internals Viewer para ajudar nesse sentido (e acredito que o código-fonte de Mark Rasmussen Orca MDF está disponível também, que presumivelmente tem algum código para decodificar o formato de linha interno).

Para obter um exemplo de como fazer isso no TSQL, consulte esta postagem do blog o que demonstra que é perfeitamente possível extrair informações úteis do log desde que o objetivo do projeto seja limitado. Escrever um leitor de log completo que pudesse lidar com alterações de esquema nos objetos e coisas como colunas esparsas (e índices de armazenamento de colunas na próxima versão) provavelmente seria uma grande quantidade de trabalho.