SQL Server 2016 - System_Versioned table - воссоздать существующую таблицу со значимыми полями SysStartTime и SysEndTime

У нас есть две таблицы, Events а также EventsLog, Events таблица показана ниже

EventsLog таблица используется для хранения истории изменений, внесенных в Events таблица с помощью триггера на UPDATE в Events Таблица.

Поскольку временные таблицы были добавлены в SQL 2016, теперь мы хотим использовать system_versioning, чтобы вести журнал наших изменений в Events Таблица.

Мы создали новую EventsTemporal таблица для миграции по существующим данным и тому EventsTemporal_History таблица работает хорошо, ведение журнала исторических записей из EventsTemporal

Однако мы не можем переопределить SysStartTime а также SysEndTime, В настоящее время мы можем только подать заявку default в эти поля при выполнении оператора INSERT.


Вопрос, используя любой возможный метод, можем ли мы переопределить SysStartTime а также SysEndTime поля, чтобы мы могли вставить значимые datetime2в них, чтобы использовать EventsTemporal_History Таблица?

Это в настоящее время, как EventsTemporal таблица выглядит. Обратите внимание на SysStartTime поле, мы хотим иметь возможность заполнять эти поля нашей собственной "отметкой времени" и не использовать SQL по умолчанию.

В идеале мы хотим иметь возможность заполнять эти поля, как показано ниже.

1 ответ

  1. Отключить SYSTEM_VERSIONING для EventsTemporal.

    ALTER TABLE EventsTemporal SET ( SYSTEM_VERSIONING = OFF );
    
  2. Обновите EventsTmeporal как обычную таблицу.

    UPDATE D
    SET D.SysStartDate = S.EventDate
    FROM dbo.EventsTemporal AS D
    INNER JOIN dbo.Events AS S 
      ON D.EventId = S.EventId;
    
  3. Включить SYSTEM_VERSIONING для EventTemporal;

    ALTER TABLE dbo.EventsTemporal ADD PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime);
    
    ALTER TABLE dbo.EventsTemporal ALTER COLUMN SysStartTime ADD HIDDEN;
    ALTER TABLE dbo.EventsTemporal ALTER COLUMN SysEndTime ADD HIDDEN;
    
    ALTER TABLE dbo.EventsTemporal
        SET ( SYSTEM_VERSIONING = ON ( HISTORY_TABLE = dbo.EventsTemporal_History ) );
    
Другие вопросы по тегам