Вы также можете хранить историю прямо в вашей таблице. Вы добавляете столбец activedate и столбец неактивной даты. Если вам не важно время вставки или изменения, используйте столбец даты вместо datetime.
Если это сделано в существующей системе, измените имя таблицы. Вы пишете представление, которое показывает только те записи, которые в данный момент активны, и называете его так, как раньше называлась старая таблица (чтобы весь старый код не ломался).
Если это новая система, создайте таблицу со столбцами, упомянутыми выше, и по-прежнему пишите представление, которое получает только активные записи. Это позволит вашим разработчикам последовательно использовать активное представление, чтобы они не забывали фильтровать записи, когда хотят отобразить данные в том виде, в котором они находятся сейчас.
Вам придется изменить способ, которым вы обычно выполняете процесс обновления записи (я бы сделал это вместо триггера), чтобы при обновлении записи она вставляла неактивную дату в текущую запись и добавляла новый. Сделайте то же самое с удалением, используя вместо триггера, чтобы деактивировать запись, а не удалить ее. Если это новый процесс, вы можете пропустить триггеры и просто написать обновления, которые делают то же самое, а также обновления неактивной даты, поданной, когда вы хотите удалить. Тем не менее, я считаю, что триггеры более надежны с точки зрения обеспечения целостности данных. Я бы лично сделал вместо триггеров и тех, позволил разработчикам писать нормальные обновления и удаления в пользовательском интерфейсе. Это обеспечит правильную обработку всех ошибок, независимо от того, пришли они из графического интерфейса или из-за adhoc-обновления в SSMS.
Затем вы пишете сохраненный процесс с параметром даты, чтобы возвращать данные, активные при вводе даты (вам может потребоваться некоторый специальный код для обработки, если ввод даты был раньше, чем данные, которые вы начали делать), затем используйте это в Форма графического интерфейса для пользователя, чтобы увидеть данные на определенную дату.