Поделитесь знаниями о значениях полей master..fn_dblog

Timid
Дата: 19.02.2010 21:08:59
Добрый день.

Пытаюсь достать интересующие меня данные из файла журнала транзакций. Попользовавшись поиском по форуму и вот этой статьей [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]?
Timid
Дата: 22.02.2010 19:09:21
UP
оочень надо
Богдан Гоцкий
Дата: 23.02.2010 19:11:21
В свое время тоже интересовала структура [RowLog Contents 0/1..]. Все что нашел - здесь. На страницах 27,28,31 очень хорошо показана внутренняя структура.
Timid
Дата: 24.02.2010 19:18:55
Ага, спасибо, я тоже в основном оттуда доставал всё, а вот ещё нашёл - http://www.sqlskills.com/BLOGS/PAUL/post/Inside-the-Storage-Engine-Anatomy-of-a-record.aspx
Timid
Дата: 24.02.2010 19:48:07
Кстати, чтоб не плодить темы, можеть кто подскажет:
Есть значение записи журнала транзакций:

0x1000CC0001000000210300....00000000000E0

Если разобрать по байтам, получается следующее

      0x10 10000 	(bit 4) record has a NULL bitmap; (bits 0..3 == 0) it's a primary record
	 00 		it's not a ghost forwarded record

	 CC           	reverse to 00CC = 204 byte offset to NULL bitmap. It's absolute value 
	 00            of the offset from the this byte (means CC is the first byte in offset)


	01   		First fixed column (ID, 4 bytes). Reverse to 0001 = 1
	00
	00
	00



и так далее. Как проще всего будет переместиться по указанному оффсету? Ну или сразу на 206 байт от начала записи, чтобы вычитать [NULL bitmap] и [Number of Columns]?

Или надо в лоб делать логическое & по интересующей меня маске? Просто проблема в том, что я не знаю длины записи, чтобы правильно построить маску
Timid
Дата: 25.02.2010 12:20:55
и ещё вопрос :)

Как можно из hex типа
0x12EF001G
получить varchar типа
'0x12EF001G'

тогда решается большинство проблем с оффсетами, реверсами и т.д., т.к. можно обращаться к любому "байту" в строке, а потом преобразовывать его в hex и наконец делать convert(varchar(max), this_hex_value)
Паганель
Дата: 25.02.2010 12:50:42
declare @v varbinary(255)
set @v = 0x12EF00

select stuff(upper(sys.fn_varbintohexstr(@v)), 2, 1, 'x') as result

result
--------------------------------------------------------------
0x12EF00

(1 row(s) affected)
Timid
Дата: 25.02.2010 13:12:50
Паганель
declare @v varbinary(255)
set @v = 0x12EF00

select stuff(upper(sys.fn_varbintohexstr(@v)), 2, 1, 'x') as result

result
--------------------------------------------------------------
0x12EF00

(1 row(s) affected)


Спасибо, Паганель! :)
Критик
Дата: 25.02.2010 15:31:47
Timid,

будет проще использовать convert со стилем 1 или 2,
Timid
Дата: 25.02.2010 17:04:57
Критик
Timid,

будет проще использовать convert со стилем 1 или 2,


А разве оно поможет в моём случае?

style
Is the style of the date format used to convert datetime or smalldatetime data to character data (nchar, nvarchar, char, varchar, nchar, or nvarchar data types); or the string format used to convert float, real, money, or smallmoney data to character data (nchar, nvarchar, char, varchar, nchar, or nvarchar data types). When style is NULL, the result returned is also NULL.