"始终作为行开始/结束"和"期间为SYSTEM_TIME"

时间:2016-12-14 00:03:30

标签: sql sql-server tsql

我目前正在学习新的"系统版本的时态表"在sql server 2016中引入。然而,我有点难以理解"生成总是作为行开始/结束"和" PERIOD FOR SYSTEM_TIME",这两者都是系统版本化时态表所必需的。

有人可以向我解释一下吗?在此先感谢您的帮助!

CREATE TABLE dbo.Employees
(
    empid INT NOT NULL CONSTRAINT PK_Employees PRIMARY KEY NONCLUSTERED,
    empname VARCHAR(25) NOT NULL,
    department VARCHAR(50) NOT NULL,
    salary NUMERIC(10, 2) NOT NULL,

    sysstart DATETIME2(0) GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,

    sysend DATETIME2(0) GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,

    PERIOD FOR SYSTEM_TIME(sysstart, sysend),
    INDEX ix_Employees CLUSTERED(empid, sysstart, sysend)
)

WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeesHistory)
);

2 个答案:

答案 0 :(得分:2)

SQL Server 2016中的时态表

这是SQL Server 2016及以后的一项了不起的新功能。

在快速点中,什么是时态表?

  • 2011年由ANSI / ISO for SQL
  • 引入
  • IBM DB2& Oracle 10g,11g和12c是早期采用者。
  • 旨在保持数据更改的完整历史记录,并允许简单的时间点分析。
  • 每个时态表都有两个明确定义的列,每个列都有一个datetime2数据类型。

来自MSDN

  

系统版本的时态表必须定义主键和   只有一个PERIOD FOR SYSTEM_TIME定义了两个datetime2   列,声明为始终作为行开始/结束

所以A system-versioned表的主键(将其视为时态表的昵称)定义并且只有一个PERIOD FOR SYSTEM_TIME定义了两个datetime2列,以便于进行简单的时间点分析或时间旅行As Mr.Borko Novakovic said at Channel 9),声明为GENERATED ALWAYS AS ROW START / END

<强>参考文献:

答案 1 :(得分:0)

系统版本化时间表使用时间单位来跟踪任何行更改,使用类型为DateTime2(开始和结束时间)的2列。通过使用DateTime2,SQL可以获得与时区无关的准确时间。

SYSTEM_TIME通过检查开始和结束时间用作PERIOD,此字段也使用for select语句从事务和历史表中获取历史记录。

SELECT * FROM [Your_Table]
    FOR SYSTEM_TIME    
        BETWEEN '2014-01-01 00:00:00.0000000' AND '2015-01-01 00:00:00.0000000'