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

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

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

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

  1. Use Test
  2. go
  3.  
  4. create table T1(ID int identity primary key,
  5. COl1 nvarchar(50),
  6. TimeFrom datetime2 generated always as row start,
  7. TimeTo datetime2 generated always as row end,
  8. period for system_time(TimeFrom,TimeTo)) with (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.T1History));

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

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

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

Step 1:新增数据

  1. insert into T1 (Col1)
  2. values (''),(''),('')
  3.  
  4. select * from T1
  5. select * from T1History
  6.  
  7. ID COl1 TimeFrom TimeTo
  8. ----------- -------------------------------------------------- --------------------------- ---------------------------
  9. 1 1111 2016-10-07 07:28:30.3598532 9999-12-31 23:59:59.9999999
  10. 2 2222 2016-10-07 07:28:30.3598532 9999-12-31 23:59:59.9999999
  11. 3 3333 2016-10-07 07:28:30.3598532 9999-12-31 23:59:59.9999999
  12.  
  13. (3 行受影响)
  14.  
  15. ID COl1 TimeFrom TimeTo
  16. ----------- -------------------------------------------------- --------------------------- ---------------------------

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

Step 2:修改数据

  1. update T1 set Col1 = Col1+'New' where ID = 2
  2.  
  3. select * from T1
  4. select * from T1History
  5.  
  6. ID COl1 TimeFrom TimeTo
  7. ----------- -------------------------------------------------- --------------------------- ---------------------------
  8. 1 1111 2016-10-07 07:28:30.3598532 9999-12-31 23:59:59.9999999
  9. 2 2222New 2016-10-07 07:30:38.0561513 9999-12-31 23:59:59.9999999
  10. 3 3333 2016-10-07 07:28:30.3598532 9999-12-31 23:59:59.9999999
  11.  
  12. ID COl1 TimeFrom TimeTo
  13. ----------- -------------------------------------------------- --------------------------- ---------------------------
  14. 2 2222 2016-10-07 07:28:30.3598532 2016-10-07 07:30:38.0561513

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

Step 3:删除

  1. delete from T1 where ID = 3
  2. select * from T1
  3. select * from T1History
  4.  
  5. ID COl1 TimeFrom TimeTo
  6. ----------- -------------------------------------------------- --------------------------- ---------------------------
  7. 1 1111 2016-10-07 07:28:30.3598532 9999-12-31 23:59:59.9999999
  8. 2 2222New 2016-10-07 07:30:38.0561513 9999-12-31 23:59:59.9999999
  9.  
  10. ID COl1 TimeFrom TimeTo
  11. ----------- -------------------------------------------------- --------------------------- ---------------------------
  12. 2 2222 2016-10-07 07:28:30.3598532 2016-10-07 07:30:38.0561513
  13. 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 的提醒,创建这种类型的表需要有主键才行~居然忘记了

  1.  

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

  1. Sql Server 2016新功能之 Row-Level Security

    Sql Server 2016 有一个新功能叫 Row-Level Security ,大概意思是行版本的安全策略(原来我是个英语渣_(:з」∠)_) 直接上例子.这个功能相当通过对表添加一个函数作为 ...

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

    原文:SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表) 作为SQL Server 2016(CTP3.x)的另一 ...

  3. SQL Server 2014新功能PPT

        本篇文章是我在公司内部分享SQL Server 2014新功能的PPT,在本PPT中我详细描述了SQL Server除了BI方面的新功能,以及提供了大量的测试.希望对大家有帮助.     请点 ...

  4. SQL Server 2016新特性:列存储索引新特性

    SQL Server 2016新特性:列存储索引新特性 行存储表可以有一个可更新的列存储索引,之前非聚集的列存储索引是只读的. 非聚集的列存储索引支持筛选条件. 在内存优化表中可以有一个列存储索引,可 ...

  5. SQL Server 2016新特性:DROP IF EXISTS

    原文:SQL Server 2016新特性:DROP IF EXISTS  在我们写T-SQL要删除某个对象(表.存储过程等)时,一般会习惯先用IF语句判断该对象是否存在,然后DROP,比如: 旧 ...

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

    前言 SQL Server 2016引入新的查询语句性能监控.调试和优化工具/功能 -- Query Store.以前我们发现一条查询语句性能突然下降,我们要去找出问题的所在往往需要通过调用一些DMV ...

  7. SQL Server 2016新特性: 对JSON的支持

     SQL Server 2005开始支持XML数据类型,提供原生的XML数据类型.XML索引及各种管理或输出XML格式的函数.随着JSON的流行,SQL Server2016开始支持JSON数据类 ...

  8. SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Row-Level Security(行级别安全控制)

    SQL Server 2016 CPT3中包含了一个新特性叫Row Level Security(RLS),允许数据库管理员根据业务需要依据客户端执行脚本的一些特性控制客户端能够访问的数据行,比如,我 ...

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

    Dynamic Data Masking是为了防止敏感数据暴露给未经授权的用户,以一种最小开销和维护成本的形式.Dynamic Data Masking用于表的字段,相当于盖住字段数据的一部分.比如一 ...

随机推荐

  1. Android PopupWindow Dialog 关于 is your activity running 崩溃详解

    Android PopupWindow Dialog 关于 is your activity running 崩溃详解 [TOC] 起因 对于 PopupWindow Dialog 需要 Activi ...

  2. Electron的环境配置

    原文地址http://huisky.com/blog/161218121551123 本文介绍了Electron的环境配置,包括Electron下载.nodejs下载安装.NPM+Bower安装配置. ...

  3. Atitit opencv版本新特性attilax总结

    Atitit opencv版本新特性attilax总结 1.1. :OpenCV 3.0 发布,史上功能最全,速度最快的版1 1.2. 应用领域2 1.3. OPENCV2.4.3改进 2.4.2就有 ...

  4. PDO

    'PDO'是数据访问抽象层'用mysqli类找到mysqli驱动根据驱动操作mysqli数据库'其他类找到sqlserver驱动根据驱动操作sqlserve数据库'PDO 访问其他数据库 PDO的用法 ...

  5. Enterprise Solution 生成实体数据访问接口与实现类型 Code Smith 6.5 模板文件下载

    数据库表定义为SalesOrder,用LLBL Gen Pro生成的实体定义是SalesOrderEntity,再用Code Smith生成的数据读写接口是ISalesOrderManager,最后是 ...

  6. 【Win 10 应用开发】分析 URI 中的查询字符串

    分析URI中的字符有K种方法(K >= 2),如果查询字符串中的参数比较简单,可以通过子字符串查找的方式来处理:如果查询字符串相对复杂,你可以使用正则表达式来匹配 key1=value1 ,  ...

  7. JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)

    1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法.   2.有时候需要传递大量可选参数的情形时,一 ...

  8. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(8)-MVC与EasyUI DataGrid 分页

    系列目录 前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 EasyUI Datagrid在加载的时候会提交一些分页的信息到后台,我们需要根据这些信息来进行数据分页再次返回到前台 实 ...

  9. webService学习之路(三):springMVC集成CXF后调用已知的wsdl接口

    webService学习之路一:讲解了通过传统方式怎么发布及调用webservice webService学习之路二:讲解了SpringMVC和CXF的集成及快速发布webservice 本篇文章将讲 ...

  10. JSON(及其在ajax前后端交互的过程)小识

    一. json介绍 json是一种轻量级的数据交换格式,规则很简单: 并列的数据之间用逗号(,)分隔: 映射用冒号(:)表示: 并列数据的集合(数组)用方括号([])表示: 映射的集合(对象)用大括号 ...