Извините, для любого работоспособного решения потребуется вторая таблица.
Одним из таких решений является версия нормальной формы (vnf), которая является частным случаем 2nf. Рассмотрим таблицу, содержащую логическое поле (при условии, что она нормализована как минимум на 3nf). Теперь вы хотите отслеживать изменения, сделанные в логическом поле. Один из способов - превратить строки в версии, добавив столбец EffectiveDate, вместо этого, вместо обновления строки, напишите новую строку с текущей датой в поле даты (или обновив, если логическое поле не изменилось).
Это позволяет отслеживать поле, при этом появляется новая версия для каждого изменения поля. Но есть серьезные недостатки, не в последнюю очередь из-за того, что строка больше не является сущностью, а версией объекта. Это делает невозможным использование внешнего ключа для этой таблицы, поскольку те, которые хотят ссылаться на объект.
Но внимательно посмотрите на дизайн. Перед изменением у вас была хорошая нормализованная таблица без отслеживания изменений. После добавления колонки EffectiveDate произошли незначительные изменения. Все поля, кроме булевского поля, по-прежнему зависят только от ПК. Логическое поле зависит не только от PK, но и от нового поля даты. Это больше не 2nf.
Нормализация таблицу требует перемещения булево поле и поле даты в новую таблицу:
create table NewTable(
EntityID int not null references OriginalTable(ID),
EffDate date not null,
TrackedCol boolean,
constraint PK_NewTable primary key(EntityID, EffDate)
);
Первая версия вставляется, когда новая строка вставляется в исходной таблице. С этого момента другая версия добавляется только тогда, когда обновление в исходную таблицу изменяет значение логического поля.
Here - это предыдущий ответ, который включает запрос на получение текущих и любых прошлых значений версий данных. Я обсуждал этот дизайн много раз здесь.
Также существует способ структурирования дизайна, поэтому код приложения не нужно изменять. То есть, редизайн будет полностью прозрачным для существующего кода. Ответ, приведенный выше, содержит другую ссылку на дополнительную документацию, чтобы показать, как это делается.
Поиск «аудита» или «контрольного журнала» на SO. Или просто взгляните на правую колонку. – DanMan
«История» и «текущее состояние» лучше всего делать как две отдельные таблицы. –