Как получить последнее время вставки / обновления / удаления datetime на Sql Server 2005?

не дубликат моего предыдущего вопроса

Есть ли способ получить последнее datetime, когда таблица / база данных имела вставку / обновление / удаление на Sql Server 2005? Предпочтительно без создания триггеров.

Я знаю, что когда вам нужно последнее обновление для каждой строки, вам нужны триггеры. Но я не уверен, нужны ли они, когда вы просто хотите получить последнее обновление для всей таблицы.

Solutions Collecting From Web of "Как получить последнее время вставки / обновления / удаления datetime на Sql Server 2005?"

Вы можете легко получить последние вставленные / обновленные / удаленные даты, как следует:

CREATE FUNCTIOn fn_TablesLastUpdateDate(@Date NVARCHAR(20)) RETURNS @table TABLE(TableName NVARCHAR(40), LastUpdated Datetime) AS BEGIN IF(@Date='') OR (@Date Is Null) OR (@Date='0') BEGIN INSERT INTO @table SELECT TOP 100 PERCENT TABLENAME,LASTUPDATED FROM ( SELECT B.NAME AS 'TABLENAME', MAX(STATS_DATE (ID,INDID)) AS LASTUPDATED FROM SYS.SYSINDEXES AS A INNER JOIN SYS.OBJECTS AS B ON A.ID = B.OBJECT_ID WHERE B.TYPE = 'U' AND STATS_DATE (ID,INDID) IS NOT NULL GROUP BY B.NAME ) AS A ORDER BY LASTUPDATED DESC END ELSE BEGIN INSERT INTO @table SELECT TOP 100 PERCENT TABLENAME,LASTUPDATED FROM ( SELECT B.NAME AS 'TABLENAME', MAX(STATS_DATE (ID,INDID)) AS LASTUPDATED, CONVERT(VARCHAR, MAX(STATS_DATE (ID,INDID)), 103) as Date FROM SYS.SYSINDEXES AS A INNER JOIN SYS.OBJECTS AS B ON A.ID = B.OBJECT_ID WHERE B.TYPE = 'U' AND STATS_DATE (ID,INDID) IS NOT NULL GROUP BY B.NAME ) AS A WHERE Date=@Date ORDER BY LASTUPDATED DESC END RETURN END -- SELECT * from fn_TablesLastUpdateDate('06/11/2012') 
 SELECT t.name, user_seeks, user_scans, user_lookups, user_updates, last_user_seek, last_user_scan, last_user_lookup, last_user_update FROM sys.dm_db_index_usage_stats i JOIN sys.tables t ON ( t.object_id = i.object_id ) WHERE database_id = DB_ID() 

Как показывают предыдущие два ответа, в SQL Server нет встроенных функций, которые легко доступны для ваших требований.

Существует тонна динамических представлений управления, которые могут рассказать вам некоторые из ваших точек интереса, например sys.dm_db_index_usage_stats которая сообщает вам, когда данный индекс получил последний запрос или обновление.

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

Извините, я не могу дать вам лучшую новость – так оно и есть.

В SQL Server 2008 у вас есть дополнительные новые функции, которые могут удовлетворить некоторые из ваших требований – проверьте:

  • Изменение захвата данных
  • Аудит SQL Server

Марк

Учитывая, что ответов пока нет, вот мои 2 цента:

  • Для Insert, я бы использовал поле DateTime со значением по умолчанию GETDATE ()
  • Для обновления я также использовал бы поле DateTime, измененное триггером, каждый раз, когда будет обновление.
  • Для удаления запись не будет доступна, поэтому вы не можете ее запросить.

Я думал об использовании Timestamps для отключения триггеров, но вы не можете преобразовать Timestamp в Datetime.

EDIT: Или, может быть, вы можете использовать «metatable», где в триггере вы сохраните даты изменений

 CREATE TABLE metatable ( table_name VARCHAR(40) NOT NULL PRIMARY KEY, last_insert DATETIME NOT NULL, last_update DATETIME NOT NULL, last_delete DATETIME NOT NULL ) INSERT metatable VALUES ('table1', GETDATE(), GETDATE(), GETDATE()) CREATE TRIGGER trg_table1_ins ON table1 FOR INSERT AS BEGIN UPDATE metatable SET last_insert = GETDATE() WHERE table_name = 'table1' END CREATE TRIGGER trg_table1_upd ON table1 FOR UPDATE AS BEGIN UPDATE metatable SET last_update = GETDATE() WHERE table_name = 'table1' END CREATE TRIGGER trg_table1_del ON table1 FOR DELETE AS BEGIN UPDATE metatable SET last_delete = GETDATE() WHERE table_name = 'table1' END 

Я надеюсь, что это будет полезно

За короткое время (с момента запуска сервера) вы проверяете last_user_update column sys.dm_db_index_usage_stats last_user_update column . Но поскольку это только учитывает обновления с момента запуска сервера, его нельзя использовать в течение длительного периода времени.

В течение длительных периодов времени, если таблица не огромна, ваше приложение может хранить таблицу CHECKSUM_AGG (ВСЕ) . Вам нужно будет только повторить этот раз, при запуске приложения и сравнить его с ранее сохраненным значением. Кроме того, приложение может обнаруживать изменения с помощью DMV. При завершении работы приложения она должна хранить текущую контрольную сумму таблицы.

без триггеров: вы можете иметь столбец LastChgDate в таблице и устанавливать его при вставке / обновлении / удалении строки. Вам придется «удалить», используя столбец состояния, установленный в «D» или что-то в этом роде. Поместите индекс в этот столбец и выберите MAX (), чтобы увидеть, когда было сделано изменение.

Ну, вы можете сохранить столбец с «LastUpdateDate», который установлен на текущую дату / время сервера для любой вставки или обновления. Затем вы можете просто запросить строку с последним LastUpdateDate.

Я бы добавил отслеживание изменений в микс – в отличие от Change Data Capture, это не только функция Enterprise.

Читайте об этом по адресу http://msdn.microsoft.com/en-us/library/cc280462.aspx

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

MDD

Просто! Сначала добавьте столбец «LastUpdated». Дайте ему значение по умолчанию для GetDate (). Это позаботится о вставках. Во-вторых, добавьте триггер обновления обновлений, который обновляет LastUpdated до GetDate (). Обновления теперь охвачены. Наконец, добавьте бит / логическое поле IsDeleted со значением по умолчанию 0. Если пользователь хочет удалить строку, переверните бит. Поскольку, когда вы «удаляете» строку, вы фактически обновляете поле IsDeleted (и, следовательно, используете действие «Обновление»), «Deletes» теперь имеют временную метку.

Чтобы получить самую последнюю активность в таблице: получить только метку времени:

 SELECT MAX(LastUpdated) FROM MyTable 

Чтобы получить дополнительную информацию:

 SELECT MAX(LastUpdated), ID /*or whatever you need to know*/ FROM MyTable