Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Leggi il registro delle transazioni di SQL Server

Puoi usare sys.fn_dblog per leggere il registro delle transazioni. Esempio sotto.

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

Per un delete e insert operazione IIRC il [RowLog Contents 0] contiene l'intera riga inserita ed eliminata. Gli aggiornamenti sono un po' più complicati in quanto è possibile registrare solo una riga parziale.

Per decodificare questo formato di riga è necessario comprendere come le righe vengono archiviate internamente in SQL Server. Il libro Microsoft SQL Server 2008 Internals copre questo in dettaglio. È inoltre possibile scaricare il SQL Server Internals Viewer per aiutare in questo senso (e credo che il codice sorgente per Mark Rasmussen Orca MDF è disponibile anche che presumibilmente ha del codice per decodificare il formato della riga interna).

Per un esempio di questa operazione in TSQL, vedere questo post del blog il che dimostra che è perfettamente possibile estrarre informazioni utili dal log purché lo scopo del progetto sia limitato. Tuttavia, scrivere un lettore di log completo in grado di far fronte alle modifiche dello schema negli oggetti e cose come colonne sparse (e indici dell'archivio colonne nella prossima versione) sarebbe un'enorme quantità di lavoro.