Добрый день.
Пытаюсь достать интересующие меня данные из файла журнала транзакций. Попользовавшись поиском по форуму и вот этой статьей [url=]https://www.blackhat.com/presentations/bh-usa-07/Fowler/Presentation/bh-usa-07-fowler.pdf[/url], решил действовать согласно следующему плану:
1. Определяю диапазон страниц, пренадлежащих интересующему меня объекту
SELECT
@startpage = (CONVERT (INT, SUBSTRING (first, 4, 1)) * POWER (2, 24)) + (CONVERT (INT, SUBSTRING (first, 3, 1)) * POWER (2, 16)) + (CONVERT (INT, SUBSTRING (first, 2, 1)) * POWER (2, 8)) + (CONVERT (INT, SUBSTRING (first, 1, 1)))
,@endpage = (CONVERT (INT, SUBSTRING (first, 4, 1)) * POWER (2, 24)) + (CONVERT (INT, SUBSTRING (first, 3, 1)) * POWER (2, 16)) + (CONVERT (INT, SUBSTRING (first, 2, 1)) * POWER (2, 8)) + (CONVERT (INT, SUBSTRING (first, 1, 1))) + dpages
FROM sysindexes si
INNER JOIN sysfiles sf ON si.groupid = sf.groupid
WHERE id = @objectid
AND 1 = indid
AND @fileid = CONVERT (VARCHAR (2), (CONVERT (INT, SUBSTRING (first, 6, 1)) * POWER (2, 8)) + (CONVERT (INT, SUBSTRING (first, 5, 1))))
2. При помощи ф-ции master..fn_dblog отбираю из лога информацию, касающуюся интересующих меня страниц
SELECT Operation
,[Transaction ID]
,AllocUnitName
,[Page ID]
,[Slot ID]
,[Offset in Row]
,[RowLog Contents 0]
,[RowLog Contents 1]
,[RowLog Contents 2]
,[RowLog Contents 3]
,[RowLog Contents 4]
,[Log Record]
FROM master..fn_dblog(NULL,NULL) AS shot
WHERE dbo.HexToInt (SUBSTRING(shot.[Page ID], CHARINDEX(':',shot.[Page ID]) + 1, LEN(shot.[Page ID]) - CHARINDEX(':',shot.[Page ID])))
BETWEEN @startpage AND @endpage
Функцию взял отсюда [url=]http://sql.ru/forum/actualthread.aspx?tid=606741&hl=hex+int[/url]
Насколько я понял, если запись вставляется, то надо парсить [RowLog Contents 0], если какое-то поле изменяется, его старое значение заносится в [RowLog Contents 0] , а новое - в [RowLog Contents 1]. А как по офф-сету определить какое именно поле подверглось модификации?
И что хранится в поле [LOG record]?