SQL Server时态表

时间:2018-12-06 16:50:54

标签: sql-server sql-server-2016 sql-server-2017 temporal-tables

我有一个SQL Server 2017数据库,并且创建了一个Department表,如下所示

CREATE TABLE Department
(
    DeptID INT NOT NULL PRIMARY KEY CLUSTERED,
    DeptName VARCHAR(50) NOT NULL,
    ManagerID INT NULL,
    ParentDeptID INT NULL,
    StartTime DATETIME2 GENERATED ALWAYS AS ROW START
        CONSTRAINT DF_Department_SysStartTime DEFAULT SYSUTCDATETIME() NOT NULL,
    EndTime DATETIME2 GENERATED ALWAYS AS ROW END
        CONSTRAINT DF_Department_SysEndTime 
        DEFAULT CONVERT( DATETIME2, '9999-12-31 23:59:59' ) NOT NULL,
    PERIOD FOR SYSTEM_TIME(StartTime, EndTime)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DepartmentHistory));

接下来,我使用下面的代码插入一行

INSERT INTO Department (DeptID, DeptName, DepartmentDescription)
VALUES (1, 'Sales', 'Sales department')

我在Department表和DepartmentHistory表上进行了选择,Department包含了我插入的1行,但DepartmentHistory没有。

我运行了如下更新,将更新DepartmentHistory填充到第一行。

UPDATE Department 
SET DeptID = 2 
WHERE DeptID = 1

时态表不显示插入的行吗?

2 个答案:

答案 0 :(得分:0)

所有这些都很好地记录在MS Docs中: https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017

插入: 在INSERT上,系统根据系统时钟将SysStartTime列的值设置为当前事务的开始时间(在UTC时区中),并将SysEndTime列的值分配为最大值9999-12- 31。这会将行标记为打开。

更新: 在UPDATE上,系统会在历史记录表中存储该行的先前值,并根据系统时钟将SysEndTime列的值设置为当前事务的开始时间(在UTC时区)。这会将行标记为已关闭,并记录该行对其有效的时间段。在当前表中,该行将使用其新值进行更新,并且系统会根据系统时钟将SysStartTime列的值设置为事务的开始时间(在UTC时区中)。当前表中SysEndTime列的更新行的值仍为最大值9999-12-31。

答案 1 :(得分:0)

是的,除非已更改,否则新插入的列没有版本控制。值一旦更改,便会在历史记录表中进行更新,因为会生成记录的版本。