我有一个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
临时表不显示插入的行吗?
这些都在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。
是新插入的列没有版本控制,除非它被更改。一旦值发生变化,它就会在历史表中更新,因为生成了一个版本的记录。