Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Lire le journal des transactions SQL Server

Vous pouvez utiliser sys.fn_dblog pour lire le journal des transactions. Exemple ci-dessous.

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

Pour une delete et insert opération IIRC le [RowLog Contents 0] contient toute la ligne insérée et supprimée. Les mises à jour sont un peu plus compliquées dans la mesure où seule une ligne partielle peut être enregistrée.

Pour décoder ce format de ligne, vous devez comprendre comment les lignes sont stockées en interne dans SQL Server. Le livre Microsoft SQL Server 2008 Internals couvre cela en détail. Vous pouvez également télécharger le Lecteur interne de SQL Server pour aider à cet égard (et je crois que le code source de Mark Rasmussen MDF Orca est également disponible et contient probablement du code pour décoder le format de ligne interne).

Pour un exemple de cette opération dans TSQL, voir cet article de blog ce qui démontre qu'il est parfaitement possible d'extraire des informations utiles du log tant que l'objectif du projet est limité. L'écriture d'un lecteur de journal complet capable de gérer les modifications de schéma dans les objets et des éléments tels que les colonnes clairsemées (et les index de stockage de colonnes dans la prochaine version) représenterait probablement une énorme quantité de travail.