Время модификации таблиц в MS SQL сервер
От: rsdnLeon  
Дата: 23.11.05 17:44
Оценка:
Подскажите пожалуйста, как получить дату и время модификации любой из таблиц в MS SQL сервере ? Возвращает только дату и время создания.
Re: Время модификации таблиц в MS SQL сервер
От: tpg Россия http://www.sql.ru/
Дата: 24.11.05 04:33
Оценка:
Здравствуйте, rsdnLeon, Вы писали:

L>Подскажите пожалуйста, как получить дату и время модификации любой из таблиц в MS SQL сервере ? Возвращает только дату и время создания.


http://www.sql.ru/articles/mssql/2005/030701ChangesLogging.shtml
Re: Время модификации таблиц в MS SQL сервер
От: Docker Канада  
Дата: 24.11.05 06:50
Оценка:
Здравствуйте, rsdnLeon, Вы писали:

L>Подскажите пожалуйста, как получить дату и время модификации любой из таблиц в MS SQL сервере ? Возвращает только дату и время создания.


Думаю, что стандартными средствами никак (если сам не ведешь историю изменений). Но если уж совсем не в моготу, то глянь в сторону Lumigent Log Explorer и ApexSQL Log по логам выщемишь последние изменения. Если же просто интересно, можно попробовать самому с помощью недокументированной функции:
DBCC log ([dbid[,{0|1|2|3|4}[,['lsn','[0x]x:y:z']|['numrecs',num]|['xdesid','x:y']|
          ['extent','x:y']|['pageid','x:y']|['objid',{x,'y'}]|['logrecs',{'lop'|op}...]|
          ['output',x,['filename','x']]...]]])

Код такой (тестировал на SQL Server 2000, SP4). Сначала
declare @objectId int
set @objectId = OBJECT_ID('SomeTable')
dbcc log ('Test', 0, 'objid', @objectId)

Получишь, нечто вроде:

Current LSN Operation Context Transaction ID
---------------------- ---------------- --------- --------------
00000006:000000b1:0002 LOP_INSERT_ROWS LCX_HEAP 0000:0000012a
00000006:000000b2:0002 LOP_MODIFY_ROW LCX_HEAP 0000:0000012b
00000006:000000b2:0003 LOP_MODIFY_ROW LCX_HEAP 0000:0000012b
00000006:000000b2:0004 LOP_MODIFY_ROW LCX_HEAP 0000:0000012b

Берешь ID последней транзакции, у нас — 0000:0000012b. Оговорюсь, поскольку функция не задокументирована, то не факт, что записи идут в том порядке как были выполнены операции. Хотя вполне возможно что порядок соответствует реальному. Если же он нарушен, то придется проверить время завершения всех транзакций. Как? См. дальше.

Далее запускаем:
dbcc log ('TestDB', 3)


Получаем несколько рекордсетов типа:

...

Current LSN Operation Context
---------------------- ------------------------- -------------------------
00000006:000000b2:0001 LOP_BEGIN_XACT LCX_NULL ...

...

Current LSN Operation Context Transaction ID Tag Bits Log Record Length Previous LSN Flag Bits End Time ...
---------------------- ------------------------- ------------------------- -------------- -------- ----------------- ---------------------- --------- ----------------------- ----------------------
00000006:000000b2:0006 LOP_COMMIT_XACT LCX_NULL 0000:0000012b 0x0000 52 00000006:000000b2:0001 0x0200 2005/11/24 00:50:41:587 ...

Как видишь, там есть время завершения транзакции для транзакции 0000:0000012b. Пример можно оптимизировать.
В общем, в коде обычнного продукта я бы такого избегал как чумы. Если же надо проверить что-то не очень сложное, или просто почувствовать себя начинающим хакером, то почему бы и нет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.