“GENERATED ALWAYS AS ROW START/END”和“PERIOD FOR SYSTEM_TIME”

问题描述:

我目前正在学习在sql server 2016中引入的新“系统版本化时态表”。但是,我有点难以获得我的脑海中围绕着“GENERATED ALWAYS AS ROW START/END”和“PERIOD FOR SYSTEM_TIME”的确切含义和用法,这两者都是系统版本化时态表所要求的。“GENERATED ALWAYS AS ROW START/END”和“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) 
); 

态表中的SQL服务器2016

这是SQL Server 2016,后来一个惊人的新功能。

In Quick points,什么是时态表?

  • 在2011by ANSI/ISO介绍了SQL
  • IBM DB2 &的Oracle 10g,11g和12C是尝鲜。
  • 旨在保持数据更改的完整历史记录,并允许简单的时间点分析。
  • 每个时态表都有两个明确定义的列,每个列都有一个datetime2数据类型。

MSDN

一种系统,版本化态表必须有一个主键定义和 恰好具有一个期间为2 DATETIME2 列定义SYSTEM_TIME,声明为ALWAYS GENERATED AS ROW开始/结束

所以A system-versioned表的主键(考虑作为临时表的昵称)已定义并且恰好具有一个PERIOD FOR SYSTEM_TIME定义的机智h两次或允许在一次分析变得更简单点或时间旅行As Mr.Borko Novakovic said at Channel 9),DATETIME2列声明为GENERATED ALWAYS AS ROW START/END

快一点,现在,是有必要界定GENERATED ALWAYS AS ROW START

NO, it is not技术上,但在实际的商业生活中应该是。

参考文献:

系统版本时空表使用的时间单位用于跟踪任何行更改类型的使用2列DateTime2(开始和结束时间)。通过使用DateTime2,SQL可以获得准确的时间,而不考虑时区。

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

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