Могу ли я прочитать метаданные из SQL Server, чтобы узнать последнюю измененную строку / таблицу? - PullRequest
3 голосов
/ 11 марта 2010

У нас есть база данных с сотнями таблиц.

Существует ли какой-либо источник данных meta в SQL Server, который я могу программно запросить, чтобы получить имя последней измененной таблицы и строки?

Или нам нужно реализовать это самим с полями в каждой таблице под названием LastChangedDateTime и т. Д .?

Ответы [ 3 ]

3 голосов
/ 11 марта 2010

С точки зрения выяснения того, когда таблица в последний раз изменялась, существует хитрый способ доступа к этой информации, но он не скажет вам, какая строка была изменена, только когда. SQL Server ведет статистику использования индекса и записывает последние поиски / сканирования / поиска и обновления в индексе. Это также разбивает это по пользователю / системе.

Фильтрация только для пользовательских таблиц, любая вставка / обновление / удаление приведет к обновлению индекса, и DMV обновится с этой новой информацией.

select o.name, 
max(u.last_user_seek) as LastSeek, 
max(u.last_user_scan) as LastScan, 
max(u.last_user_lookup) as LastLookup,
max(u.last_user_update) as LastUpdate 
from sys.dm_db_index_usage_stats u
inner join sys.objects o on  o.object_id = u.object_id
where o.type = 'U' and o.type_desc = 'USER_TABLE'
group by o.name

Однако это не идеально, куча не имеет индекса для начала - и я никогда не рассматривал его использование для производственного кода в качестве механизма отслеживания, а только в качестве криминалистического инструмента для проверки очевидных изменений.

Если вы хотите надлежащее отслеживание изменений на уровне строк, вам придется либо встроить его, либо взглянуть на особую функцию захвата данных изменений в SQL 2008.

1 голос
/ 11 марта 2010

Представление [sys].[tables] сообщит вам, когда таблица была создана и последний раз изменена (с точки зрения схемы, а не вставки, обновления или удаления). Насколько мне известно, в базе данных нет встроенной информации о последних изменениях для каждой записи (в любом случае это заняло бы много места, поэтому, вероятно, было бы неплохо ее не иметь). Поэтому вам следует добавить последнее измененное поле самостоятельно и, возможно, обновить его автоматически с помощью триггера.

0 голосов
/ 11 марта 2010

В зависимости от модели восстановления вы можете получить это из журнала транзакций, используя fn_dblog http://www.sqlskills.com/BLOGS/PAUL/post/Search-Engine-QA-6-Using-fn_dblog-to-tell-if-a-transaction-is-contained-in-a-backup.aspx

...