Если вы можете избежать истории, делайте. Это боль.
Если полная история неизбежна (регулируемые финансовые и медицинские данные и т. П.), Рассмотрите возможность добавления таблиц истории. Используйте триггер для «версии» в таблицах истории. Таким образом, вы не зависите от своего приложения, чтобы гарантировать, что версия записана - все вставки / обновления / удаления записываются независимо от источника.
Если ваше приложение должно взаимодействовать с историческими данными, убедитесь, что оно доступно только для чтения. Нет смысла фиксировать истории транзакций, если кто-то может просто изменить их.
Если вас беспокоит одновременное обновление, рассмотрите возможность использования метки времени изменения записи. Когда пользователь A и пользователь B просматривают запись в полдень, они получают метку времени записи. Когда пользователь А обновляет запись, его метка времени совпадает с меткой записи, поэтому обновление проходит, а метка времени также обновляется. Когда пользователь B обновляет запись пять минут спустя, его метка времени не совпадает с меткой записи, поэтому он предупреждается, что запись изменилась с момента его последнего просмотра. Может быть, он автоматически перезагружается ...
Что бы вы ни решили, я бы не стал смешивать текущие и исторические данные.
Запуск ресурсов по комментариям:
Ключами для запуска аудита являются виртуальные таблицы, «вставленные» и «удаленные» . Эти таблицы содержат строки, на которые влияют INSERT, UPDATE или DELETE. Вы можете использовать их для аудита изменений. Что-то вроде:
CREATE TRIGGER tr_TheTrigger
ON [YourTable]
FOR INSERT, UPDATE, DELETE
AS
IF EXISTS(SELECT * FROM inserted)
BEGIN
--this is an insert or update
--your actual action will vary but something like this
INSERT INTO [YourTable_Audit]
SELECT * FROM inserted
END
IF EXISTS(SELECT * FROM deleted)
BEGIN
--this is a delete, mark [YourTable_Audit] as required
END
GO