【发布时间】:2015-09-22 04:56:58
【问题描述】:
当我想在 SQL Server 2016 中创建新的临时表时,我想知道如何创建系统版本表?
【问题讨论】:
标签: sql-server-2016 temporal-tables
当我想在 SQL Server 2016 中创建新的临时表时,我想知道如何创建系统版本表?
【问题讨论】:
标签: sql-server-2016 temporal-tables
来自here:
为了使表成为系统版本表,它需要 以下:
- 主键
- 表选项 SYSTEM_VERSIONING 设置为 ON
- 两个不可为空的 DATETIME2() 列表示行有效期的开始和结束
- 开始列应标有 GENERATED ALWAYS AS ROW START 选项
- 应使用 GENERATED ALWAYS AS ROW END 选项标记结束列
- 期间列的指定:PERIOD FOR SYSTEM_TIME (, )
- 一个链接的历史表(SQL Server 可以为您创建)来保存修改行的过去状态
【讨论】:
你可以参考这两个链接:
http://sqlwithmanoj.com/2015/06/15/temporal-data-support-in-sql-server-2016-part-1/
USE [TestManDB]
GO
CREATE TABLE dbo.Department
(
DepartmentID int NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED,
DepartmentName varchar(50) NOT NULL,
ManagerID int NULL,
ValidFrom datetime2 GENERATED ALWAYS AS ROW START NOT NULL,
ValidTo datetime2 GENERATED ALWAYS AS ROW END NOT NULL,
PERIOD FOR SYSTEM_TIME (
ValidFrom,
ValidTo
)
)
WITH ( SYSTEM_VERSIONING = ON ); -- No History table name given here
GO
感谢上面的源代码链接。
【讨论】:
通过使用 System_versioning=ON ,它会自动分配系统表名,但如果您想像下面这样明确提及您的系统表
--create table or use existing table
CREATE TABLE [dbo].[table1](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](255) NOT NULL,
[updated_at] [datetime] NULL
)
GO
--Adding additional field for temporal tables
alter table dbo.table1
add start_time DATETIME2 generated always as row start hidden default sysutcdatetime()
,end_time DATETIME2 generated always as row end hidden default sysutcdatetime()
,period for system_time (start_time, end_time)
go
--enable system versioning
alter table dbo.table1
set (system_versioning = ON ( history_table = dbo.table1_history))
go
【讨论】:
请根据每个场景参考how to create temporal tables in SQL Server的样例。
最简单的形式是创建一个新的 SQL 表作为临时表,如下所示
create table sampleTable (
IdColumn int identity(1,1) not null primary key clustered,
Code varchar(5),
CurrentValue varchar(100),
SysStartTime datetime2 Generated Always as Row Start Not Null,
SysEndTime datetime2 Generated Always as Row End Not Null,
Period for System_Time (SysStartTime, SysEndTime)
)
with (System_Versioning = ON)
这将在当前数据库中创建一个名为 sampleTable 的数据库表及其对应的历史表
【讨论】: