原文

Temporal Table是SQL Server2016的新特性。能存储你表里面任意时间点的数据信息。 换句话说,如果你针对一张表执行任何更新或者删除操作,老数据会被新数据覆盖,下次查询的时候是查的最新的数据,但如果使用了temporal table你可以查询到任意时间点的数据。

Temporal table是如何工作的呢?

当你往Temporal table插入记录的时候会发生什么?

当你往temporal table插入数据的时候,数据会留在temporal table中,但是不会影响history table。

当你更新或者删除Temporal table的数据时会发生什么?

当你更新或者删除Temporal table的数据时,已存在的记录会先被移动到history table中,记录temporal table数据的改变。

当你查询Temporal table的时候会发生什么?

当你查询temporal table的时候, temporal table会自己决定是从temporal table中还是从history table中返回数据,你不应该使用任何join关联temporal table和history table进行查询。

创建Temporal Table

创建temporal table时,其对应的history table会自动创建(如果你已经有了一个history table,你可以将他和temporal table关联起来)。下面是一个普通的创建表的脚本,但是有些额外特殊的列。这些列用来定义temporal table的period definition,并且这些列是隐藏的。当你查询的时候这些列不会出现在结果集中。脚本中还将history table名指定为“dbo.tbl_Product_History”。当然你也可以不声明history table的名字,SQL会自动为temporal table创建一个默认的history table。

CREATE DATABASE SampleDB
GO
USE SampleDB
GO
--DROP TABLE tbl_Product
--GO
CREATE TABLE tbl_Product
(
Product_ID int NOT NULL PRIMARY KEY CLUSTERED,
Product_Name varchar(50) NOT NULL,
Rate numeric(18,2), /*Temporal Specific Fields - Period Definition */
[Valid From] datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
[Valid Till] datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME ([Valid From] ,[Valid Till])
)
WITH
/* Temporal Specific - System-Versioning Configuration*/
(
SYSTEM_VERSIONING = ON
(HISTORY_TABLE = dbo.tbl_Product_History, DATA_CONSISTENCY_CHECK = ON)
);
GO

执行insert

之前说过,当你对一个temporal table执行insert语句,不会影响history table。下面我们执行insert,然后看看相应的结果。

USE SampleDB
GO
INSERT INTO dbo.tbl_Product VALUES
(1,'Product A', 300)
,(2,'Product B', 400)
GO SELECT * FROM tbl_Product
GO
SELECT * FROM dbo.tbl_Product_History
GO

执行update

当你对一个temporal table执行update语句,老数据会被移到history table中,temporal table会保存最新的数据。下面我们执行update,然后看看相应的结果。

USE SampleDB
GO
UPDATE tbl_Product SET Rate =Rate/2
WHERE Product_ID IN (1,2)
GO SELECT * FROM tbl_Product
GO
SELECT * FROM dbo.tbl_Product_History
GO

执行delete

当你对一个temporal table执行delete语句,老数据会被移到history table中,temporal table会保存最新的数据。下面我们执行delete,然后看看相应的结果。

USE SampleDB
GO
DELETE FROM tbl_Product WHERE Product_ID = 2
GO SELECT * FROM tbl_Product
GO
SELECT * FROM dbo.tbl_Product_History
GO

执行select

在temporal table中执行select非常有意思。

下面的脚本和正常的table一样返回table最新的结果集:

USE SampleDB
GO
--Current State of the table
SELECT * FROM tbl_Product
GO

下面使用 FOR SYSTEM_TIME ‘2015-06-27 21:33:50.9002439’来查询temporal table,这将返回这个表在‘2015-06-27 21:33:50.9002439’ 时的状态。

USE SampleDB
GO
SELECT * FROM tbl_Product
FOR SYSTEM_TIME AS OF '2015-06-27 21:33:50.9002439'
GO

下面使用FOR SYSTEM_TIME at ‘2015-06-27 21:43:31.2982847’来查询temporal table,这将返回这个表在‘2015-06-27 21:43:31.2982847’时的状态。

USE SampleDB
GO
SELECT * FROM tbl_Product
FOR SYSTEM_TIME AS OF '2015-06-27 21:43:31.2982847'
GO

总结

有了temporal table,将改变我们为数据仓库设计数据库的方式。因为我们不需要创建一个独立的audit表通过触发器或者存储过程记录数据的变化,temporal table自动为我们完成了这些工作。

[译]SQL SERVER 2016 – Temporal Tables的更多相关文章

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

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

  2. SQL Server 2016中In-Memory OLTP继CTP3之后的新改进

    SQL Server 2016中In-Memory OLTP继CTP3之后的新改进 转译自:https://blogs.msdn.microsoft.com/sqlserverstorageengin ...

  3. SQL Server 2016 CTP2.2 的关键特性

    SQL Server 2016 CTP2.2 的关键特性 正如微软CEO 说的,SQL Server2016 是一个Breakthrough Flagship  Database(突破性的旗舰级数据库 ...

  4. SQL Server 2016里TempDb的提升

    几个星期前,SQL Server 2016的最新CTP版本已经发布了:CTP 2.4(目前已经是CTP 3.0).这个预览版相比以前的CTP包含了很多不同的提升.在这篇文章里我会谈下对于SQL Ser ...

  5. SQL Server 2016原生支持JSON

    转载原地址: http://www.cnblogs.com/lyhabc/p/4747694.html SQL Server 2005 开始支持 XML 数据类型,提供原生的 XML数据类型.XML ...

  6. SQL Server 2016 的「動態資料遮罩 (Dynamic Data Masking)」

    一些特別注重資訊安全.個人資料的公司或產業 (如: 金融.保險業),通常「測試用資料庫」的資料,會加上「遮蔽:去識別化」的功能,避免個資外洩.以往必須自己撰寫 SQL 語句或 Stored Proce ...

  7. 数据库技术丛书:SQL Server 2016 从入门到实战(视频教学版) PDF

    1:书籍下载方式: SQL Server2016从入门到实战 PDF 下载  链接:https://pan.baidu.com/s/1sWZjdud4RosPyg8sUBaqsQ 密码:8z7w 学习 ...

  8. SQL Server 2016最值得关注的10大新特性

    全程加密技术(Always Encrypted) 全程加密技术(Always Encrypted)支持在SQL Server中保持数据加密,只有调用SQL Server的应用才能访问加密数据.该功能支 ...

  9. SQL Server 2016 特性和安装方法

    SQL Server 2016 特性: 全程加密技术(Always Encrypted),动态数据屏蔽(Dynamic Data Masking),JSON支持,多TempDB数据库文件,PolyBa ...

随机推荐

  1. extern C小结

    名词解释 1.extern extern翻译为外部的,用在变量或函数之前,使其可见范围拓宽,这就是为啥叫extern吧.那它是用来干嘛的呢?当用在变量或函数之前,提示编译器到其他模块寻找其定义. 举个 ...

  2. Vim常用插件安装及配置方法

    Vundle 安装 git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 配置 vimrc首部添 ...

  3. JavaScript ES6 核心功能一览

    JavaScript 在过去几年里发生了很大的变化.这里介绍 12 个你马上就能用的新功能. JavaScript 历史 新的语言规范被称作 ECMAScript 6.也称为 ES6 或 ES2015 ...

  4. C++基础知识--DAY2

    昨天我们主要是讲的C++相对于C语言的变化,结尾讲述了一点引用的基础知识,要明白,引用就是对一个变量取别名,在C++中需要用指针的都可以思考是否可以用引用来代替. 1. 常引用 常引用(const s ...

  5. 原生JS正则实现trim()

    Jquery中封装有trim() 原生需要自己实现,我们可以用原型的方式自己封装trim()方法,实现去掉前后空格.前空格.后空格...所以不必抱怨,简单又灵活,这才是强大的JS的特色 String. ...

  6. selenium-网站demo学习-test Design-优化自动化代码

    看selenium的网站的文档,里面的自动化用例设计有一些小点很靠谱.学了很多,可以用作优化自己的代码. 1.测试类型: Testing Static Content Testing Links Fu ...

  7. HDU 1560 DNA sequence (迭代加深搜索)

    The twenty-first century is a biology-technology developing century. We know that a gene is made of ...

  8. c3p0配置文件(c3p0.properties.xml)解读

    package cn.lijun.demo; import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource ...

  9. SQL语法基础之高级应用

    SQL语法基础之高级应用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.存储过程与函数 1>.CREATE PROCEDURE 用来创建存储过程 mysql> ? ...

  10. Arduino、bootloader、BadUSB、及其相关硬件知识入门学习

    内容中包含 base64string 图片造成字符过多,拒绝显示