1

我有一个 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包含我插入但DepartmentHistory没有插入的 1 行。

我运行如下更新,发布更新,其中DepartmentHistory填充了 1 行。

UPDATE Department 
SET DeptID = 2 
WHERE DeptID = 1

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

4

2 回答 2

0

是的,除非更改,否则新插入的列没有版本控制。一旦值被更改,它就会在历史表中更新,因为生成了一个版本的记录。

于 2019-04-12T04:49:14.763 回答
0

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

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

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

于 2018-12-06T17:00:37.850 回答