Вы можете использовать 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')
Для операций delete
и insert
IIRC [RowLog Contents 0]
содержит всю вставленную и удаленную строку. Обновления немного сложнее, поскольку в них может быть зарегистрирована только частичная строка.
Чтобы декодировать этот формат строк, вам необходимо понять, как строки хранятся внутри в SQL Server. Книга Microsoft SQL Server 2008 Internals описывает это в некоторых деталях. Вы также можете загрузить Средство просмотра SQL Server , чтобы помочь в этом (и я полагаю, что также доступен исходный код Марка Расмуссена Orca MDF , предположительно имеет некоторый код для декодирования внутреннего формата строки).
Пример выполнения этого в TSQL см. в этом блоге , который демонстрирует, что вполне возможно извлекать полезную информацию из журнала, если цель проекта ограничена. Написание полноценного считывателя журналов, способного справиться с изменениями схемы в объектах и таких вещах, как разреженные столбцы (и индексы хранилищ столбцов в следующей версии), вероятно, потребует огромных усилий.