【问题标题】:SQL Server temporal tables in 20162016 年的 SQL Server 时态表
【发布时间】:2015-09-22 04:56:58
【问题描述】:

当我想在 SQL Server 2016 中创建新的临时表时,我想知道如何创建系统版本表?

【问题讨论】:

    标签: sql-server-2016 temporal-tables


    【解决方案1】:

    来自here

    为了使表成为系统版本表,它需要 以下:

    • 主键
    • 表选项 SYSTEM_VERSIONING 设置为 ON
    • 两个不可为空的 DATETIME2() 列表示行有效期的开始和结束
      • 开始列应标有 GENERATED ALWAYS AS ROW START 选项
      • 应使用 GENERATED ALWAYS AS ROW END 选项标记结束列
    • 期间列的指定:PERIOD FOR SYSTEM_TIME (, )
    • 一个链接的历史表(SQL Server 可以为您创建)来保存修改行的过去状态

    【讨论】:

      【解决方案2】:

      你可以参考这两个链接:

      http://sqlmag.com/sql-server/first-look-system-versioned-temporal-tables-part-1-creating-tables-and-modifying-data

      http://blogs.msdn.com/b/manub22/archive/2015/06/30/temporal-data-with-system-versioned-tables-in-sql-server-2016.aspx

      http://sqlwithmanoj.com/2015/06/15/temporal-data-support-in-sql-server-2016-part-1/

          USE [TestManDB]
          GO
      
          CREATE TABLE dbo.Department 
          (
          DepartmentID        int NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED, 
          DepartmentName      varchar(50) NOT NULL, 
          ManagerID           int NULL, 
      
          ValidFrom           datetime2 GENERATED ALWAYS AS ROW START NOT NULL, 
          ValidTo             datetime2 GENERATED ALWAYS AS ROW END   NOT NULL,   
      
          PERIOD FOR SYSTEM_TIME (
          ValidFrom, 
          ValidTo
          )   
          )
          WITH ( SYSTEM_VERSIONING = ON ); -- No History table name given here
          GO
      

      感谢上面的源代码链接。

      【讨论】:

      • @ManojPandey ,我在网上找到并在这里分享了 :) 完美的博客文章解决了上述问题。不客气,也感谢你的文章。 :)
      【解决方案3】:

      通过使用 System_versioning=ON ,它会自动分配系统表名,但如果您想像下面这样明确提及您的系统表

      --create table or use existing table
      CREATE TABLE [dbo].[table1](
          [id] [int] IDENTITY(1,1) NOT NULL,
          [name] [varchar](255) NOT NULL,
          [updated_at] [datetime] NULL
      )
      
      GO
      --Adding additional field for temporal tables
      alter table dbo.table1
      add start_time DATETIME2 generated always as row start hidden default sysutcdatetime()
          ,end_time DATETIME2 generated always as row end hidden default sysutcdatetime()
          ,period for system_time (start_time, end_time)
      go
      
      --enable system versioning
      alter table dbo.table1
      set (system_versioning = ON ( history_table = dbo.table1_history))
      go
      

      【讨论】:

        【解决方案4】:

        请根据每个场景参考how to create temporal tables in SQL Server的样例。

        最简单的形式是创建一个新的 SQL 表作为临时表,如下所示

        create table sampleTable (
          IdColumn int identity(1,1) not null primary key clustered,
          Code varchar(5),
          CurrentValue varchar(100),
          SysStartTime datetime2 Generated Always as Row Start Not Null,
          SysEndTime datetime2 Generated Always as Row End Not Null,
          Period for System_Time (SysStartTime, SysEndTime)
         )
         with (System_Versioning = ON) 
        

        这将在当前数据库中创建一个名为 sampleTable 的数据库表及其对应的历史表

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-07-28
          • 1970-01-01
          • 2018-06-25
          • 1970-01-01
          • 2019-10-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多