我有很多数据表,我想将其转换为Microsoft Temporal表,但是当我想转换时态表时会丢失我的数据。 我的代码是:
Alter 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));
如何通过保存数据来将存在表改为Sql时态表?
答案 0 :(得分:5)
创建时态表。
将原始表中的数据插入时态表。
放弃原始表格。
答案 1 :(得分:3)
首先,您应该将系统时间段的两列添加到任何表中。 像这样:
CREATE TABLE DepartmentHistory
(
DeptID int NOT NULL
, DeptName varchar(50) NOT NULL
, SysStartTime datetime2 NOT NULL
, SysEndTime datetime2 NOT NULL
);
GO
CREATE CLUSTERED COLUMNSTORE INDEX IX_DepartmentHistory
ON DepartmentHistory;
CREATE NONCLUSTERED INDEX IX_DepartmentHistory_ID_PERIOD_COLUMNS
ON DepartmentHistory (SysEndTime, SysStartTime, DeptID);
GO
CREATE TABLE Department
(
DeptID int NOT NULL PRIMARY KEY CLUSTERED
, DeptName varchar(50) NOT NULL
, SysStartTime datetime2 NOT NULL
, SysEndTime datetime2 NOT NULL
) ;
在更改代码中,SysStartTime
和SysEndTime
包含系统期间时间列。
然后您可以轻松地将它们转换为时态表:
ALTER TABLE dbo.Department
ADD PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime])
ALTER TABLE dbo.Department
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DepartmentHistory, DATA_CONSISTENCY_CHECK = ON));
并且,如果您有临时表并且想要编辑表模式,那么您可以通过以下代码执行此操作:
ALTER TABLE Test.dbo.Department
SET (SYSTEM_VERSIONING = OFF)
答案 2 :(得分:2)
分两步开启员工表中的系统版本控制
创建默认历史记录表
ALTER TABLE Employee
ADD
ValidFrom datetime2 (2) GENERATED ALWAYS AS ROW START HIDDEN
constraint DF_ValidFrom DEFAULT DATEADD(second, -1, SYSUTCDATETIME())
, ValidTo datetime2 (2) GENERATED ALWAYS AS ROW END HIDDEN
constraint DF_ValidTo DEFAULT '9999.12.31 23:59:59.99'
, PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo);
ALTER TABLE Employee
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Employee_History));
执行上述脚本后,将在历史记录表中透明地收集所有数据更改。 在典型的数据审计方案中,您将查询在感兴趣的时间段内应用于单个行的所有数据更改。使用集群行存储B-Tree创建默认历史记录表,以有效地解决此用例。