Идеи создания базы данных для сбора контрольных журналов

Как я могу вести журнал данных в моей БД?

Мне нужно вести журнал каждого изменения, внесенного в каждую строку. Это означает, что я не могу разрешить выполнение DELETE и UPDATE.

Как я могу сохранить такой журнал?

Ответ 1

Используйте "Вставить только базы данных"

Основная идея заключается в том, что вы никогда не обновляете и не удаляете данные.

Каждая таблица имеет 2 столбца datetime от и до.

Они начинаются со значения null в каждом (от начала времени до конца)

Когда вам нужно "изменить" строку, вы добавляете новую строку, в то же время вы обновляете до в предыдущей строке до "Сейчас" и из в строку, которую вы добавляете в настоящее время.

Вы читаете данные из таблицы через представление, в котором есть где = null.

Этот метод также дает вам изображение состояния вашей базы данных в любой момент времени.

ИЗМЕНИТЬ

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

Ответ 2

[Поздний пост, но он добавляет два метода, которые уже не упомянуты здесь)

Чтение журнала транзакций - если ваша база данных находится в режиме полного восстановления, журнал транзакций хранит много полезной информации, которая может использоваться для просмотра истории каждой строки. Недостатком является то, что по умолчанию это не поддерживается. Вы можете попробовать использовать недокументированные функции DBCC LOG или fn_dblog или сторонний инструмент, например ApexSQL Log

Использование Change Data Capture - Изменить захват данных по существу делает то же самое, что показано выше, но более упорядочено и немного проще в использовании. К сожалению, это доступно только в корпоративной версии.

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

Ответ 3

Используйте базу данных "только вставить", как описано Ширазом Бхаджи, но вы можете использовать более простой метод. Для каждой таблицы, для которой требуется ведение данных аудита, просто добавьте дополнительный столбец для Обновленного времени, по умолчанию. Когда вы вносите изменения в запись, вместо обновления просто вставляете все свои данные; столбец "UpdateTime" получит текущее время.

Обратите внимание, что этот метод означает, что вам нужно сломать или пересмотреть свои УНИКАЛЬНЫЕ ограничения; вы можете сохранить первичный ключ, но уникальность становится составной частью вашего первичного ключа и вашего обновленного времени.

Этот метод имеет то преимущество, что дает вам известную совокупность исторических данных для каждой записи в таблице (каждая запись действительна в течение заданного времени, если она является TOP 1 записей WHERE TimeOfInterest > UpdateTime ORDER BY UpdateTime DESC) с низкий накладные расходы (всего один столбец на столе). Это также вполне приемлемо для преобразования из таблиц, не использующих этот метод, с простым ALTER TABLE, чтобы добавить один столбец (который вы можете назвать последовательно). Затем вам просто нужно изменить свои ограничения UNIQUE, чтобы использовать составные их текущие ограничения и столбец UpdateTime, и некоторые запросы нужно будет изменить.

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

Ответ 4

Совершенно другой подход состоит в том, чтобы иметь только журнал аудита. Затем вы используете это для создания самой последней версии ваших данных. Вы периодически создаете "контрольные точки" или используете кеширование, чтобы ускорить это.

Существует презентация о том, кто использует эту технику: http://www.infoq.com/presentations/greg-young-unshackle-qcon08. Большим преимуществом здесь является то, что, поскольку у вас есть только журнал аудита, вы будете вполне уверены, что ваш контрольный журнал правильный.

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