如何通过保留数据将存在 table 更改为 SQL 临时 table?

How can alter existence tables to SQL Temporal table by keeping data?

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

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

如何通过保留数据将存在 table 更改为 Sql 时间 table?

  1. 创建你的时间table。

  2. 将原始 table 中的数据插入临时 table。

  3. 放下你原来的table。

分两步在 Employee table 中启用系统版本控制

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

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

执行上述脚本后,所有的数据变化都会透明地收集到历史记录中table。 在典型的数据审计场景中,您将查询在感兴趣的时间段内应用于单个行的所有数据更改。默认历史记录 table 是使用集群行存储 B 树创建的,以有效解决此用例。

首先,您应该为任何 tables 添加两列系统时间段。 像这样:

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

up代码中,SysStartTimeSysEndTime有系统周期时间列。

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

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

而且,如果您有时间 table 并且您想要编辑 table 的架构,那么您可以通过以下代码来完成:

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