【问题标题】:How can alter existence tables to SQL Temporal table by keeping data?如何通过保留数据将存在表更改为 SQL 临时表?
【发布时间】:2016-11-09 12:00:56
【问题描述】:

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

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 时态表?

【问题讨论】:

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


    【解决方案1】:
    1. 创建您的临时表。

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

    3. 放下你原来的桌子。

    【讨论】:

    • 我有很多表可能有 100 个表,我认为这种方式并非每次都适用于所有表。谢谢你的回答。
    【解决方案2】:

    分两步在 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));  
      

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

    【讨论】:

      【解决方案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           
      ) ;
      

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-28
        • 2018-01-17
        • 2012-03-13
        • 2021-02-06
        • 2015-12-02
        • 1970-01-01
        • 2012-06-27
        • 2019-11-27
        相关资源
        最近更新 更多