SQL Server时态表

问题描述 投票:1回答:2

我有一个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填充了1行。

UPDATE Department 
SET DeptID = 2 
WHERE DeptID = 1

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

sql-server sql-server-2016 sql-server-2017 temporal-tables
2个回答
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。这标志着行是开放的。

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.