Ham*_*gar 8 sql sql-server temporal-database sql-server-2016 temporal-tables
我有很多数据表,我想转换为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));
Run Code Online (Sandbox Code Playgroud)
如何通过保存数据将存在表改为Sql时态表?
小智 6
分两步在 Employee 表中打开系统版本控制
创建默认历史表
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));
Run Code Online (Sandbox Code Playgroud)执行上述脚本后,所有数据更改都将透明地收集在历史表中。在典型的数据审计场景中,您将查询在感兴趣的时间段内应用于单个行的所有数据更改。默认历史表是使用集群行存储 B 树创建的,以有效解决此用例。
首先,您应该向任何表添加两列系统时间段。像这样:
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
) ;
Run Code Online (Sandbox Code Playgroud)
在up代码中,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));
Run Code Online (Sandbox Code Playgroud)
而且,如果您有临时表并且想要编辑表架构,那么您可以通过以下代码来完成:
ALTER TABLE Test.dbo.Department
SET (SYSTEM_VERSIONING = OFF)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
933 次 |
| 最近记录: |