如何通过保留数据将存在 table 更改为 SQL 临时 table?
How can alter existence tables to SQL Temporal table by keeping data?
我有很多 table 数据,我想将其转换为 Microsoft Temporal table,但是当我想转换时间 table 时,我的数据丢失了。
我的代码是:
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));
如何通过保留数据将存在 table 更改为 Sql 时间 table?
创建你的时间table。
将原始 table 中的数据插入临时 table。
放下你原来的table。
分两步在 Employee table 中启用系统版本控制
- 添加新的期间列(隐藏)
创建默认历史记录table
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));
执行上述脚本后,所有的数据变化都会透明地收集到历史记录中table。
在典型的数据审计场景中,您将查询在感兴趣的时间段内应用于单个行的所有数据更改。默认历史记录 table 是使用集群行存储 B 树创建的,以有效解决此用例。
首先,您应该为任何 tables 添加两列系统时间段。
像这样:
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
) ;
up代码中,SysStartTime
和SysEndTime
有系统周期时间列。
然后您可以轻松地将它们转换为临时 tables:
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));
而且,如果您有时间 table 并且您想要编辑 table 的架构,那么您可以通过以下代码来完成:
ALTER TABLE Test.dbo.Department
SET (SYSTEM_VERSIONING = OFF)
我有很多 table 数据,我想将其转换为 Microsoft Temporal table,但是当我想转换时间 table 时,我的数据丢失了。 我的代码是:
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));
如何通过保留数据将存在 table 更改为 Sql 时间 table?
创建你的时间table。
将原始 table 中的数据插入临时 table。
放下你原来的table。
分两步在 Employee table 中启用系统版本控制
- 添加新的期间列(隐藏)
创建默认历史记录table
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));
执行上述脚本后,所有的数据变化都会透明地收集到历史记录中table。 在典型的数据审计场景中,您将查询在感兴趣的时间段内应用于单个行的所有数据更改。默认历史记录 table 是使用集群行存储 B 树创建的,以有效解决此用例。
首先,您应该为任何 tables 添加两列系统时间段。 像这样:
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
) ;
up代码中,SysStartTime
和SysEndTime
有系统周期时间列。
然后您可以轻松地将它们转换为临时 tables:
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));
而且,如果您有时间 table 并且您想要编辑 table 的架构,那么您可以通过以下代码来完成:
ALTER TABLE Test.dbo.Department
SET (SYSTEM_VERSIONING = OFF)