如何通过保存数据将存在表更改为SQL Temporal表?

时间:2016-11-09 12:00:57

标签: sql sql-server sql-server-2016 temporal-database temporal-tables

我有很多数据表,我想将其转换为Microsoft Temporal表,但是当我想转换时态表时会丢失我的数据。 我的代码是:

Alter TABLE dbo.Employee   
(    
  [EmployeeID] int NOT NULL PRIMARY KEY CLUSTERED   
  , [Name] nvarchar(100) NOT NULL  
  , [Position] varchar(100) NOT NULL   
  , [Department] varchar(100) NOT NULL  
  , [Address] nvarchar(1024) NOT NULL  
  , [AnnualSalary] decimal (10,2) NOT NULL  
  , [ValidFrom] datetime2 (2) GENERATED ALWAYS AS ROW START  
  , [ValidTo] datetime2 (2) GENERATED ALWAYS AS ROW END  
  , PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)  
 )    
 WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory)); 

如何通过保存数据来将存在表改为Sql时态表?

3 个答案:

答案 0 :(得分:5)

  1. 创建时态表。

  2. 将原始表中的数据插入时态表。

  3. 放弃原始表格。

答案 1 :(得分:3)

首先,您应该将系统时间段的两列添加到任何表中。 像这样:

CREATE TABLE DepartmentHistory   
(    
     DeptID int NOT NULL  
   , DeptName varchar(50) NOT NULL  
   , SysStartTime datetime2 NOT NULL  
   , SysEndTime datetime2 NOT NULL   
);   
GO   
CREATE CLUSTERED COLUMNSTORE INDEX IX_DepartmentHistory   
   ON DepartmentHistory;   
CREATE NONCLUSTERED INDEX IX_DepartmentHistory_ID_PERIOD_COLUMNS   
   ON DepartmentHistory (SysEndTime, SysStartTime, DeptID);   
GO   
CREATE TABLE Department   
(    
    DeptID int NOT NULL PRIMARY KEY CLUSTERED  
   , DeptName varchar(50) NOT NULL  
   , SysStartTime datetime2  NOT NULL  
   , SysEndTime datetime2 NOT NULL           
) ;

在更改代码中,SysStartTimeSysEndTime包含系统期间时间列。

然后您可以轻松地将它们转换为时态表:

ALTER TABLE dbo.Department   
   ADD PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime])   
ALTER TABLE dbo.Department      
   SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DepartmentHistory, DATA_CONSISTENCY_CHECK = ON));  

并且,如果您有临时表并且想要编辑表模式,那么您可以通过以下代码执行此操作:

ALTER TABLE Test.dbo.Department   
   SET (SYSTEM_VERSIONING = OFF) 

答案 2 :(得分:2)

分两步开启员工表中的系统版本控制

  1. 添加新的期间列(HIDDEN)
  2. 创建默认历史记录表

    ALTER TABLE Employee   
    ADD   
    ValidFrom datetime2 (2) GENERATED ALWAYS AS ROW START HIDDEN    
        constraint DF_ValidFrom DEFAULT DATEADD(second, -1, SYSUTCDATETIME())  
    , ValidTo datetime2 (2)  GENERATED ALWAYS AS ROW END HIDDEN     
        constraint DF_ValidTo DEFAULT '9999.12.31 23:59:59.99'  
    , PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo);   
    
    ALTER TABLE Employee    
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Employee_History));  
    
  3. 执行上述脚本后,将在历史记录表中透明地收集所有数据更改。 在典型的数据审计方案中,您将查询在感兴趣的时间段内应用于单个行的所有数据更改。使用集群行存储B-Tree创建默认历史记录表,以有效地解决此用例。