2016-10-06 12 views
0

У нас есть две таблицы: Events и EventsLog. Таблица Events показана нижеSQL Server 2016 - System_Versioned table - воссоздайте существующую таблицу со значимыми полями SysStartTime и SysEndTime

enter image description here

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

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

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

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


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

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

enter image description here

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

enter image description here

ответ

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)); 
    
+0

Привет @qxg, это здорово, и я ценю ваши усилия! Стол History, как уже упоминалось, хорош, и вы правы, SysEndTime заполнены разумными «правильными» данными, а не 9999-xxx. Проблема в том, что 'SysStartTime' в главной таблице« События » – Skaterhaz

+0

@Skaterhaz извините, я допустил некоторую ошибку. Принцип тот же, изменяя данные периода до включения временного. Вы можете попробовать самостоятельно, пока я обновляю свой ответ. – qxg

+0

У меня нет SQL Server 2016 вручную. Если приведенный выше сценарий не работает, попробуйте повторно создать EventTemporal полностью с добавленным вручную столбцом SysStartTime/SysEndTime. Вы можете проверить текущий сценарий создания EventTemporal для соответствующих столбцов. – qxg

 Смежные вопросы

  • Нет связанных вопросов^_^