Вы правы, что нет 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 рекомендует использовать изоляцию снимков:
Выбор подхода, который будет работать для приложения, когда вы с помощью отслеживания изменений (или любой пользовательский механизм отслеживания), требует значительного анализа . Поэтому гораздо проще использовать изоляцию снимка .
См. Http://stackoverflow.com/questions/1227707/how-to-get-last-insert-update-delete-datetime-on-sql-server-2005? – cubitouch
Вы не устанавливаете значение отметки времени. Sql Server устанавливает его. Посмотрите на ответ на этот пост для примера. http://stackoverflow.com/questions/17116334/sql-server-2008-row-insert-and-update-timestamps – granadaCoder
@granadaCoder, да, извините, я использовал неправильную терминологию. – ZigiZ