SQL Server 2016 — таблица System_Versioned — повторное создание существующей таблицы со значимыми полями SysStartTime и SysEndTime.

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

введите здесь описание изображения

Таблица EventsLog используется для хранения истории изменений, внесенных в таблицу Events с помощью триггера ОБНОВЛЕНИЯ в таблице Events.

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

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

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


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

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

введите здесь описание изображения

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

введите здесь описание изображения


person Skaterhaz    schedule 06.10.2016    source источник


Ответы (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 ) );
    
person qxg    schedule 06.10.2016
comment
Привет @qxg, это здорово, и я ценю твои усилия! Как уже упоминалось, таблица History в порядке, и вы правы, SysEndTime заполняется разумными «правильными» данными, а не 9999-xxx. Проблема с SysStartTimes в основной таблице EventsTemporal - person Skaterhaz; 06.10.2016
comment
@Skaterhaz извините, я ошибся. Принцип тот же, изменение данных периода перед включением временного. Вы можете попробовать сами, пока я обновляю свой ответ. - person qxg; 06.10.2016
comment
У меня сейчас нет SQL Server 2016 под рукой. Если приведенный выше сценарий не работает, попробуйте полностью воссоздать EventsTemporal, добавив вручную столбец SysStartTime/SysEndTime. Вы можете проверить текущий сценарий создания EventsTemporal для связанных столбцов. - person qxg; 06.10.2016
comment
Спасибо @qxg, это, по сути, то, что мы делаем прямо сейчас, отключая управление версиями, но это происходит после создания таблицы с включенным GENERATE_ALWAYS для столбцов SysxxxTime. Кажется, вы не можете отключить GENERATE_ALWAYS после его объявления, что делает управление версиями бесполезным для этой задачи. Однако вы правы, мы можем просто заново создать таблицы, а затем применить управление версиями и GENERATE_ALWAYS. Так что большое спасибо! - person Skaterhaz; 06.10.2016