创建时态表
CREATE TABLE dbo.Employee
(
[EmployeeID] int NOT NULL PRIMARY KEY CLUSTERED
, [Name] nvarchar(100) NOT NULL
, [Position] varchar(100) NOT NULL
, [Department] varchar(100) NOT NULL
, [Address] nvarchar(1024) NOT NULL
, [AnnualSalary] decimal (10,2) NOT NULL
, [ValidFrom] datetime2 (2) GENERATED ALWAYS AS ROW START
, [ValidTo] datetime2 (2) GENERATED ALWAYS AS ROW END
, PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory));
插入内容: 在一个 INSERT ,系统设置为值 ValidFrom 列到当前事务的开始时间基于所述系统时钟(在 UTC 的时区)和用于将值分配 ValidTo 列的 9999-最大值 12-31。这标志着行是开放的。
更新: 在 UPDATE 上,系统将行的先前值存储在历史表中,并根据系统时钟将 ValidTo 列的值设置为当前事务的开始时间(在 UTC 时区中)。这会将该行标记为已关闭,并记录该行有效的时间段。在当前表中,行以其新值更新,系统根据系统时钟将 ValidFrom 列的值设置为事务的开始时间(在 UTC 时区中)。当前表中 ValidTo 列的更新行的值仍为最大值 9999-12-31。
DELETES :在 DELETE 上,系统将行的先前值存储在历史记录表中,并根据系统时钟将 ValidTo 列的值设置为当前事务的开始时间(在 UTC 时区中)。这会将行标记为已关闭,并记录上一行有效的时间段。在当前表中,该行将被删除。当前表的查询不会返回此行。只有处理历史数据的查询才会返回关闭行的数据。
MERGE :在 MERGE 上,操作的行为与执行最多三个语句( INSERT , UPDATE 和/或 DELETE )的行为完全相同,具体取决于 MERGE 语句中指定的操作。
提示: 系统 datetime2 列中记录的时间基于事务本身的开始时间。例如,在单个事务中插入的所有行将在与 SYSTEM_TIME 时段的开始对应的列中记录相同的 UTC 时间。