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

Ham*_*gar 8 sql sql-server temporal-database sql-server-2016 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)); 
Run Code Online (Sandbox Code Playgroud)

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

小智 6

分两步在 Employee 表中打开系统版本控制

  1. 添加新的周期列(隐藏)
  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));  
    
    Run Code Online (Sandbox Code Playgroud)

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


sag*_*agi 5

  1. 创建时态表.

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

  3. 放下原来的桌子.

  • 我有很多表可能有100个表,我认为这种方式每次都不适用于所有表.感谢您的回答. (2认同)

Beh*_*zad 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           
) ;
Run Code Online (Sandbox Code Playgroud)

在up代码中,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));  
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE Test.dbo.Department   
   SET (SYSTEM_VERSIONING = OFF) 
Run Code Online (Sandbox Code Playgroud)