Способы ведения истории данных в базе данных SQL Server 2008

В течение долгого времени мы хотели создать систему управления делами, в которой никогда не теряется никакая история. Когда изменение сделано, мы хотим записать это изменение, но у нас есть возможность вернуться в любой момент времени и посмотреть, как выглядела запись. Я хотел задать этот вопрос сообществу Stack Overflow, чтобы узнать, как это можно сделать, существуют ли уже технологии для этого?


person Dylan Vester    schedule 06.10.2010    source источник


Ответы (2)


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

То, что вы ищете, называется временными базами данных - см. Некоторые ресурсы:

person marc_s    schedule 06.10.2010

Я не уверен, как работает упомянутая временная база данных, такая как marc_s, но если вы используете SQL Server 2008 или новее, вы можете воспользоваться его встроенной функцией отслеживания измененных данных (CDC):

Включение CDC использует журнал транзакций репликации для хранения вставок, обновлений и удалений для таблицы и создает возвращающие табличное значение функции, которые позволяют извлекать строки на заданную дату / время или извлекать только изменения.

Однако вы не можете полагаться только на CDC, потому что ваш журнал транзакций станет неуправляемо большим и медленным. Итак, что вы делаете:

  • включить CDC,
  • создать таблицу истории, используя ту же схему, что и исходная таблица, но добавив еще пару столбцов для хранения информации о версии строки (очень похоже на медленно меняющееся измерение в реляционной базе данных OLAP) и
  • создать задание, которое будет периодически опрашивать функции CDC на предмет изменений с момента последней загрузки и помещать их в таблицу истории

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

person utexaspunk    schedule 06.10.2010
comment
Это похоже на множество дополнительных слоев для чего-то, что может сделать триггер, чтобы заполнить ту же самую таблицу истории, которую вы упомянули. - person Chris; 07.10.2010
comment
Это правда; хотя, в зависимости от количества столбцов, может потребоваться и множество триггеров. Любой из этих способов может быть написан программно, поэтому сложность не должна быть большой проблемой. У обоих методов есть свои плюсы и минусы, и какой из них правильный, во многом зависит от ваших требований. Вот хорошее обсуждение: sqlserverplanet.com/design/ - person utexaspunk; 07.10.2010
comment
Я использую отдельные таблицы + триггеры для управления историей записей и две другие таблицы для записи, когда и кто вносил изменения в какую запись. +1 к триггерам! - person Achilles; 03.10.2011