我有一个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
时态表不显示插入的行吗?
答案 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)
是的,除非已更改,否则新插入的列没有版本控制。值一旦更改,便会在历史记录表中进行更新,因为会生成记录的版本。