"生成始终作为行开始/结束"和"系统时间的周期"

Tho*_*hor 5 sql t-sql sql-server

我目前正在学习在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)
);
Run Code Online (Sandbox Code Playgroud)

ahm*_*der 4

SQL Server 2016 中的时态表

\n\n

这是一个令人惊奇的新功能SQL Server 2016

\n\n

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

\n\n
    \n
  • 2011 年由 ANSI/ISO 针对 SQL 推出
  • \n
  • IBM DB2 和 Oracle 10g、11g 和 12c 是早期采用者。
  • \n
  • 旨在保留数据更改的完整历史记录并允许轻松进行时间点分析。
  • \n
  • 每个时态表都有两个显式定义的列,每个列都有一个\xc2\xa0datetime2数据类型。
  • \n
\n\n

来自MSDN

\n\n
\n

系统版本控制的时态表必须定义一个主键,并且\n 必须使用两个 datetime2\n 列定义一个 PERIOD FOR SYSTEM_TIME,声明为 GENERATED ALWAYS AS ROW START / END

\n
\n\n

因此,A 表的主键system-versioned(将其视为时态表的昵称)已定义,并且恰好有一个PERIOD FOR SYSTEM_TIME定义为两个 datetime2 列,以允许轻松的时间点分析或时间旅行正如 Borko Novakovic 先生在第 9 频道所说),声明作为GENERATED ALWAYS AS ROW START / END

\n\n

参考:

\n\n\n

  • “这是一个令人惊叹的新功能” - 这是一个很好的功能,但有很多缺点和陷阱 - 例如,我们无法排除被跟踪的列,零更改“更新”操作仍然会导致添加历史行,进行架构/表设计更改非常痛苦,几乎不可能编辑历史记录等。 (3认同)