Обычный способ сделать это - хранить версии объектов.
Если добавить «версию» и «удаленное» поле к каждой таблице, в которой вы хотите сохранить контрольный журнал, тогда вместо выполнения обычных обновлений и удалений выполните следующие правила:
- Вставить - установите номер версии на 0 и вставьте как обычно.
- Обновление - увеличьте номер версии и вставьте вместо него.
- Удалить - увеличить номер версии, установить для удаленного поля значение true и вместо этого выполнить вставку.
- Получить - Получить запись с наибольшим номером версии и вернуть ее.
Если вы следуете этому шаблону, то при каждом обновлении вы будете создавать новую запись, а не перезаписывать старые данные, поэтому вы всегда сможете отслеживать и видеть все старые объекты.
Это будет работать точно так же для графиков объектов, просто добавьте новые поля в каждую таблицу в графе объектов и обработайте каждую вставку / обновление / удаление для каждой таблицы, как описано выше.
Если вам нужно знать, какой пользователь внес изменения, просто добавьте также поле «ModifiedBy».
(Вы можете выполнить эту обработку в своем коде слоя DA, или, если хотите, можете использовать триггеры базы данных, чтобы перехватывать ваши вызовы обновления / удаления / получения и повторно обрабатывать их в соответствии с правилами.)
Очевидно, что вам необходимо учитывать требования к пространству, поскольку каждое обновление приводит к появлению полностью новой записи. Если ваше приложение сильно обновляется, вы собираетесь сгенерировать много данных. Также обычно включают поля «время последнего изменения», чтобы вы могли обрабатывать базу данных в автономном режиме и удалять данные старше, чем требуется.