2014-01-06 4 views
2

Я знаю, что есть типы timestamp/rowversion, которые вы можете установить для столбца.«Временная метка» для таблиц?

Есть ли аналогичные свойства/поле/механизм для таблиц, которые могут сказать мне, если Были изменены таблицы строк (например, Row/s Inserted/Deleted/Update)?

Я могу прочитать схему таблицы, но я не вижу ни одного столбца, который представляет такую ​​информацию (если я, например, открываю схему таблицы с ADO - DATE_MODIFIED, всегда является нулевым - я также уверен, что это относится к структуре таблицы , а не строки данных).

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

Спасибо.

+0

См. Http://stackoverflow.com/questions/1227707/how-to-get-last-insert-update-delete-datetime-on-sql-server-2005? – cubitouch

+2

Вы не устанавливаете значение отметки времени. Sql Server устанавливает его. Посмотрите на ответ на этот пост для примера. http://stackoverflow.com/questions/17116334/sql-server-2008-row-insert-and-update-timestamps – granadaCoder

+0

@granadaCoder, да, извините, я использовал неправильную терминологию. – ZigiZ

ответ

3

Вы правы, что нет timestamp/rowversion, который применяется к таблице.

Вы можете создать таблицу модификаций, как вы предлагаете. Вы можете заблокировать любой оператор INSERT/UPDATE/DELETE с помощью триггера и ВСТАВИТЬ дату/время изменения. Тем не менее, эта дата/время не говорит вам что изменено-- только что что-то изменено. Это ограничение может быть приемлемым для вас.

Если вам нужна дополнительная информация о том, что изменилось, вы можете использовать столбец timestamp или дату изменения для каждой записи. Попросите код приложения записать последнюю известную максимальную отметку времени или дату изменения. Затем становится проще запрашивать измененные записи. Это также должно устранить необходимость в отдельной таблице для отслеживания дат изменения.

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

- EDIT -

Microsoft добавила change tracking and change data capture начиная с SQL Server 2008. Я никогда не использовал эту функцию, поэтому у меня нет никаких рекомендаций относительно его. Однако эта функция доступна в SQL Server Standard Edition, поэтому вам не нужно покупать Enterprise Edition, чтобы ее получить.

Для отслеживания изменений, первым настроить базу данных для использования отслеживания изменений:

ALTER DATABASE MyDatabase SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 14 DAYS) 

Далее настройте таблицы, которые вы хотите отслеживать:

ALTER TABLE MyTable ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = ON) 

Чтобы получить последнюю версию, используйте CHANGE_TRACKING_CURRENT_VERSION :

DECLARE @version BIGINT 
SET @version = CHANGE_TRACKING_CURRENT_VERSION(); 

SELECT * FROM MyTable 

Чтобы получить изменения с момента последней версии, используйте CHANGETABLE function.Использование LEFT JOIN обеспечивает запрос возвращает информацию об удаленных строках:

SELECT * 
FROM CHANGETABLE(CHANGES MyTable, @version) C 
LEFT JOIN MyTable T 
    ON T.ID = C.ID 

Обратите внимание, что Microsoft рекомендует использовать изоляцию снимков:

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

Смежные вопросы