Sql Server 2016 新功能——内置的 Temporal Tables

放假之前老大跟我提起了一下2016有个有趣的功能叫 Temporal Table ,今天去看了一下资料整理一下。

这个功能看上去像是临时表,但是其实是系统维护的一个历史记录表。(在某个程度上面比起我们手动维护的历史表应该方便了一点的)

简单直接的说,它的界面看起来是这样的(就像是T1一样) 创建了之后,就会在下面有一个T1History的表中表来记录。

然后我们来试下怎么去玩这个功能。首先,确认你的Sql Server 版本是2016。然后我们通过一个这样的语句来创建表

Use Test
go

create table T1(ID int identity primary key,
    COl1 nvarchar(50),
    TimeFrom datetime2 generated always as row start,
    TimeTo datetime2 generated always as row end,
    period for system_time(TimeFrom,TimeTo)) with (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.T1History));

这里我就简单的创建一个只有自增主键和一个列的表。创建System_Versioning 的表。必须有2个声明为datetime2 的时间字段才行,因为需要用这2个字段来记录数据的产生轨迹。

比如这里我是使用一个TimeFrom 的字段表示数据的作用开始时间,而TimeTo表示这行数据的失效时间(比方说数据被修改,被删除,那么TimeTo就会记录着修改,删除的时间)

下面我们进行测试,先做测试样例,然后再说明

Step 1:新增数据

insert into T1 (Col1)
    values (‘1111‘),(‘2222‘),(‘3333‘)

select * from T1
select * from T1History

ID          COl1                                               TimeFrom                    TimeTo
----------- -------------------------------------------------- --------------------------- ---------------------------
1           1111                                               2016-10-07 07:28:30.3598532 9999-12-31 23:59:59.9999999
2           2222                                               2016-10-07 07:28:30.3598532 9999-12-31 23:59:59.9999999
3           3333                                               2016-10-07 07:28:30.3598532 9999-12-31 23:59:59.9999999

(3 行受影响)

ID          COl1                                               TimeFrom                    TimeTo
----------- -------------------------------------------------- --------------------------- ---------------------------

新增的时候,数据都是最新的版本,所以在历史表里面并不存在记录(注明一点,TimeFrom 和TimeTo 这2个字段将由系统控制维护,并不需要手工插入,如果显示写入这个字段,将抛出错误。系统维护这2个字段,采用的时间将使用UTC格式的时间,对于我们国内,就是小时-8的操作)

Step 2:修改数据

update T1 set Col1 = Col1+‘New‘ where ID = 2

select * from T1
select * from T1History

ID          COl1                                               TimeFrom                    TimeTo
----------- -------------------------------------------------- --------------------------- ---------------------------
1           1111                                               2016-10-07 07:28:30.3598532 9999-12-31 23:59:59.9999999
2           2222New                                            2016-10-07 07:30:38.0561513 9999-12-31 23:59:59.9999999
3           3333                                               2016-10-07 07:28:30.3598532 9999-12-31 23:59:59.9999999

ID          COl1                                               TimeFrom                    TimeTo
----------- -------------------------------------------------- --------------------------- ---------------------------
2           2222                                               2016-10-07 07:28:30.3598532 2016-10-07 07:30:38.0561513

修改数据的时候。将在历史表里面写入一条历史记录,并将TimeTo设置为当前修改的UTC时间,在主表将保留数据的最新版本。

Step 3:删除

delete from T1 where ID = 3
select * from T1
select * from T1History

ID          COl1                                               TimeFrom                    TimeTo
----------- -------------------------------------------------- --------------------------- ---------------------------
1           1111                                               2016-10-07 07:28:30.3598532 9999-12-31 23:59:59.9999999
2           2222New                                            2016-10-07 07:30:38.0561513 9999-12-31 23:59:59.9999999

ID          COl1                                               TimeFrom                    TimeTo
----------- -------------------------------------------------- --------------------------- ---------------------------
2           2222                                               2016-10-07 07:28:30.3598532 2016-10-07 07:30:38.0561513
3           3333                                               2016-10-07 07:28:30.3598532 2016-10-07 07:32:04.3640717

删除数据的时候和修改的机制差不多,就是主表删除了行记录,但是历史表保留了一份删除的动作。

简单的测试就可以做到这里。下面还有几个测试说明

1 如果使用Merge,那么Merge做的操作将对应以上的增/删/改来维护版本

2 使用了经版本维护的表之后,不能使用truncate table 的操作,因为操作不支持

3 drop 表的时候,不能直接使用drop table 语句,需要先用 ALTER TABLE [dbo].[T1] SET ( SYSTEM_VERSIONING = OFF ) 来把系统维护的版本去掉,然后再分别drop 掉当前表和历史表

4 我是凑数的╮(╯_╰)╭ ~请其他大神指导补充

5 谢谢@wy123 的提醒,创建这种类型的表需要有主键才行~居然忘记了

				
时间: 2024-10-25 10:35:08

Sql Server 2016 新功能——内置的 Temporal Tables的相关文章

SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表)

原文:SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表) 作为SQL Server 2016(CTP3.x)的另一个新特性,Temporal Table(历史表)记录了表历史上任何时间点所有的数据改动.Temporal Table其实早在ANSI SQL 2011就提出了,而SAP HANA, DB2和Oracle早已在它们的产品中加入/实现了这一特性.所以说微软其实是落后了几个竞争对手.既然在CTP3.0中加入了,相信

SQL Server 2014新功能 -- 内存中OLTP(In-Memory OLTP)

SQL Server 2014新功能 -- 内存中OLTP(In-Memory OLTP) 概述 内存中OLTP(项目"Hekaton")是一个全新的.完全集成到SQL Server的数据库引擎组件. 对OLTP工作负载访问中在内存中的数据进行了优化.内存中OLTP能够帮助OLTP工作负载实现显著的性能改善,并减少处理时间.表能被视为"内存优化",提升内存中的OLTP功能.内存优化表是完全可事务的.并可以使用Transact-SQL进行访问.Transact-SQL

Exchange Server 2016新功能概览

微软计划在5月第一周即将举行的Ignite大会上首次预览Exchange Server 2016,Ignite大会将于5月4--8日期间在芝加哥举行.目前得知Exchange Server 2016新功能如下: 1.一个文档协同的新方法,使得发送链接和协同变得十分轻松,而不会遇到附件的版本问题 2.更快速且更智能的搜索,帮助用户快速在他们的邮箱和日历中找到他们所需的东西 3.对电子发现搜索性能和可靠性的重大更新 4.更好的扩展性,包括新的基于REST的API,针对Mail.Calendar以及C

SQL Server 2016新特性:DROP IF EXISTS

原文:SQL Server 2016新特性:DROP IF EXISTS ?? 在我们写T-SQL要删除某个对象(表.存储过程等)时,一般会习惯先用IF语句判断该对象是否存在,然后DROP,比如: 旧版本: IF OBJECT_ID('dbo.PERSON','U') IS NOT NULL DROP TABLE PERSON IF EXISTS (SELECT * FROM sys.objects where name = 'PERSON') DROP TABLE PERSON SQL Ser

Windows Server 2016 新功能HCI(超融合基础架构) By S2D

超融合基础架构(Hyper-Converged Infrastructure,或简称"HCI")也被称为超融合架构,是指在同一套单元设备(x86服务器)中不仅仅具备计算.网络.存储和服务器虚拟化等资源和技术,而且还包括缓存加速.重复数据删除.在线数据压缩.备份软件.快照技术等元素,而多节点可以通过网络聚合起来,实现模块化的无缝横向扩展(scale-out),形成统一的资源池.超融合架构(Hyperconvergence Infrastructure, HCI)将虚拟化计算和存储整合到同

SQL Server ->> SQL Server 2016新特性之 --- Query Store

前言 SQL Server 2016引入新的查询语句性能监控.调试和优化工具/功能 -- Query Store.以前我们发现一条查询语句性能突然下降,我们要去找出问题的所在往往需要通过调用一些DMV(比如sys.dm_exec_query_stats, sys.dm_exec_sql_text和sys.dm_exec_query_plan)来获取查询计划的一些信息,比如XML格式的执行计划,查询语句的代码,执行了多少次以及一些资源和时间的的使用消耗情况.然后根据这些信息来判断这条语句是否存在性

SQL Server ->> SQL Server 2016新特性之 -- Dynamic Data Masking

Dynamic Data Masking是为了防止敏感数据暴露给未经授权的用户,以一种最小开销和维护成本的形式.Dynamic Data Masking用于表的字段,相当于盖住字段数据的一部分.比如一些像邮件或者工资这样敏感的数据,涉及PII的,我们可以运用这个功能.运用这个功能的步骤,首先先定义一组人(database role)可以拥有看数据的权限,然后GRANT UNMASK权限给这个角色组.微软提供了4种类型的masking给我们选择:default,email,random和custo

SQL Server 2016 发送邮件功能

--1 安装好SQL Server 2016 --2 安装.Net 3.5 由于SQL Server 2016 安装不提示强制安装.NET 3.5 但是还是需要安装,数据库发送邮件会使用.NET 3.5 提供的内容,如果不安装.NET 3.5 那么mail不能正常发送 Windows Server 2012 R2 安装.NET 3.5 在增加服务和应用功能中安装失败,提示0x800f0907 原因为,需要.NET 3.5 的安装源文件. 最好的办法,使用虚拟光驱加载Windows Server

SQL Server 2016新特性:Live Query Statistics

SSMS可以提供可以查看正在执行的计划.live query plan可以查看一个查询的执行过程,从一个查询计划操作到另外一个查询计划操作.live query plan提供了整体的查询运行进度和操作级别的执行统计信息,比如产生的行数,执行的时间,操作进度等等.因为这些数据是实时的,不需要等待查询完成,这些统计信息对调试查询性能问题很有用.这个特性从SQL Server 2016开始,但是在2014上也可以运行了. Remark 到SQL Server 2016,有2个方法开启Statistic