Таблицы, в которых хранятся изменения, когда изменения основной таблицы называются таблицами аудита. Вы можете сделать это несколькими способами:
- В базе данных с использованием триггеров: Я бы порекомендовал этот подход, потому что тогда нет никакой возможности изменить данные без создания записи. При этом вам необходимо учитывать 3 типа изменений: Добавить, Удалить, Обновить. Поэтому вам нужна функциональность триггера, которая будет работать на всех трех.
Также помните, что транзакция может изменять несколько записей одновременно, поэтому вы должны работать с полным набором измененных записей, а не только с последней записью (как большинство людей запоздало понимают, что это сделали).
Управление не будет возвращено вызывающей программе, пока выполнение триггера не будет завершено. Поэтому вы должны держать код как можно более легким и быстрым.
- На среднем уровне с использованием кода: Этот подход позволит вам сохранить изменения в другой базе данных и, возможно, снять нагрузку с базы данных. Однако программист SQL, выполняющий инструкцию UPDATE, полностью обойдет ваш средний уровень, и у вас не будет контрольного журнала.
Структура таблицы аудита
У вас будут следующие столбцы:
Autonumber PK, TimeStamp, ActionType + All columns from your original table
и я делал это в прошлом следующими способами:
Структура таблицы:
Autonumber PK, TimeStamp, ActionType, TableName, OriginalTableStructureColumns
Эта структура будет означать, что вы создаете одну таблицу аудита для каждой сохраненной таблицы данных. Сохранение и восстановление данных довольно легко сделать. Я бы порекомендовал этот подход.
Имя Значение Пара:
Autonumber PK, TimeStamp, ActionType, TableName, PKColumns, ColumnName, OldValue, NewValue
Эта структура позволит вам сохранить любую таблицу, но вам придется создавать пары имя-значение для каждого столбца в вашем триггере. Это очень универсально, но дорого. Вам также понадобится написать несколько представлений, чтобы воссоздать фактические строки, разворачивая данные. Это становится утомительным и обычно не используется.