Подскажите пожалуйста, как получить дату и время модификации любой из таблиц в MS SQL сервере ? Возвращает только дату и время создания.
Здравствуйте, rsdnLeon, Вы писали:
L>Подскажите пожалуйста, как получить дату и время модификации любой из таблиц в MS SQL сервере ? Возвращает только дату и время создания.
http://www.sql.ru/articles/mssql/2005/030701ChangesLogging.shtml
Здравствуйте, 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. Пример можно оптимизировать.
В общем, в коде обычнного продукта я бы такого избегал как чумы. Если же надо проверить что-то не очень сложное, или просто почувствовать себя начинающим хакером, то почему бы и нет