"GENERATED ALWAYS AS ROW START/END"翻译为:始/终行生成。 "PERIOD FOR SYSTEM_TIME"翻译为:系统时间周期。

12

我目前正在学习SQL Server 2016中引入的新功能"系统版本时间表"。然而,对于"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)
);
2个回答

4

SQL Server 2016中的时间表

这是一个令人惊叹的新功能,适用于 SQL Server 2016 及以后版本。

简单来说,什么是时间表?

  • 由 ANSI/ISO 在 2011 年引入的 SQL 标准。
  • IBM DB2 和 Oracle 10g、11g 和 12c 是早期采用者。
  • 旨在保留数据更改的完整历史记录并允许轻松进行时间点分析。
  • 每个时间表都有两个明确定义的列,每个列都具有 datetime2 数据类型。

来自 MSDN

系统版本化的时间表必须定义主键,并且定义有一个 PERIOD FOR SYSTEM_TIME,其中包括两个 datetime2 列,声明为 GENERATED ALWAYS AS ROW START / END。

因此,对于一个 system-versioned 表(可以将其视为时间表的昵称),需要定义主键,并且确切地定义一个 PERIOD FOR SYSTEM_TIME,其中包括两个 datetime2 列,以便轻松进行时间点分析或时间旅行(如Mr.Borko Novakovic 在 Channel 9 上所说的),声明为 GENERATED ALWAYS AS ROW START / END

参考文献:


您的 MS Connect 链接已失效,因为他们已经弃用了该区域并没有将信息保留为在线存档。您能否直接在文本中包含相关要点或找到更新的链接?(我暂时编辑掉了链接) - David Spillett
“GENERATED ALWAYS”语句仅表示您指定用于定义系统时间段的两个DATETIME2字段中的值始终由SQL Server自动生成,而不是手动填充。 - PapillonUK
3
"这是一个令人惊叹的新功能" - 这是一个不错的功能,但有很多缺点和陷阱。例如,我们无法排除某些列被跟踪,零更改的 UPDATE 操作仍会导致历史记录行被添加,对架构/表格设计的更改非常痛苦,几乎不可能编辑历史记录等等。 - Dai

1

系统版本化时间表使用时间单位来跟踪任何行更改,使用两个DateTime2类型的列(开始和结束时间)。通过使用DateTime2,SQL可以获取精确时间,而不受时区影响。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接