Как отслеживать изменения данных в таблице?

У меня простой вопрос. Как я могу отслеживать изменения строки в таблице SQL Server? Вот пример того, что я хочу.

Таблица: пользователи

Столбцы: Имя | Адрес | Имя пользователя UserType

Ряд 1: Кристофер | 123 Fake Street | Любовник1234 | 1

Как я могу отслеживать, в какое время пользователь меняет "Кристофер" на "Роберт" или же он меняет "123 Fake Street" на "124 Fake Street". Мне нужно знать время изменения, а также старое значение, которое было изменено. Я также хотел бы иметь возможность отслеживать изменения UserType (который является внешним ключом), поэтому мне нужно знать, как отслеживать изменения внешнего ключа.

Это может происходить в нескольких разных таблицах, и я хотел бы отслеживать несколько разных таблиц.

2 ответа

Есть разные варианты сделать это. Я упомяну два:

Опция 1:

Добавьте столбец с именем IsHistory в вашу таблицу. Вы получите что-то вроде этого:

Name        | Address         | Username  | UserType | IsHistory
------------+-----------------+-----------+----------+----------
Christopher | 123 Fake Street | Lover1234 | 1        | 0

Затем, когда вы обновите запись, измените значение IsHistory на старой записи на 1, а затем добавьте новую запись с обновленной информацией, с записью IsHistory на 0. Вы получите что-то вроде этого:

Name        | Address         | Username  | UserType | IsHistory
------------+-----------------+-----------+----------+----------
Christopher | 123 Fake Street | Lover1234 | 1        | 1
Robert      | 123 Fake Street | Lover1234 | 1        | 0

Вариант 2:

Добавьте таблицу журнала, где вы можете иметь следующее:

LogID | Entity | ActionType | Description | OldDataXML

Затем, каждый раз, когда происходит обновление, вставьте сюда запись.

  • LogID - это ПК
  • Entity - это таблица, на которую повлияло обновление
  • Тип действия - это действие, выполняемое над объектом (INSERT, UPDATE, DELETE).
  • Описание - это краткий текст, объясняющий изменение
  • OldDataXML - это данные, которые были в записи до изменений в XML.

Например:

<User Name="Christopher" 
      Address="123 Fake Street" 
      Username="Lover1234" 
      UserType="1">
</User>

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

Надеюсь, это поможет вам.

ChangeDataCapture встроен в SQL Server 2008 R2 и может справиться с этим ( http://technet.microsoft.com/en-us/library/bb522489%28v=sql.105%29.aspx)

Альтернатива, которую я обычно использовал, очень похожа на то, что @scubaFun имел в своем ответе: создать таблицу журналирования, которая отражает исходную таблицу, плюс столбец типа изменений и изменил (и все остальное, что вы хотите), а затем используйте триггеры на главной таблице, чтобы заполнить таблицу регистрации.

Другие вопросы по тегам