0

我们有两张桌子,EventsEventsLog。下Events表如下所示

在此处输入图像描述

EventsLog表用于保存Events通过表中的 UPDATE 触发器对表所做的更改的历史记录Events

由于临时表被添加到 SQL 2016,我们现在想使用 system_versioning 来记录我们对Events表的更改。

我们已经设置了一个新EventsTemporal表来迁移现有数据,并且该EventsTemporal_History表运行良好,记录了历史条目EventsTemporal

但是,我们不能覆盖SysStartTimeand SysEndTime。目前我们只能default在执行 INSERT 语句时应用到这些字段。


问题是,使用任何可能的方法,我们是否可以覆盖SysStartTimeandSysEndTime字段,以便我们可以在其中插入有意义datetime2的 's 以利用EventsTemporal_History表?

这是当前EventsTemporal表格的外观。注意该SysStartTime字段,我们希望能够使用我们自己的“时间戳”填充这些字段,而不是使用 SQLs 默认值。

在此处输入图像描述

理想情况下,我们希望能够填充这些字段,如下所示。

在此处输入图像描述

4

1 回答 1

1
  1. 在 EventsTemporal 上禁用 SYSTEM_VERSIONING。

    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. 在 EventTemporal 上启用 SYSTEM_VERSIONING;

    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 ) );
    
于 2016-10-06T14:38:01.610 回答