环思产品论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2141|回复: 1
打印 上一主题 下一主题

SQL Server 2016新特性: Temporal table

[复制链接]

15

主题

19

帖子

277

积分

超级版主

大周

Rank: 8Rank: 8

积分
277
QQ
跳转到指定楼层
楼主
发表于 2016-6-8 09:43:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

     曾经我们遇过,误删(或更新)数据的情况,补救措施通常是还原数据库,然后把数据还原回来,整个过程比较繁琐耗时。SQL Server 2016引入了一个新的功能,即Temporaltable,我们可以称之为历史表,因为它记录了表在历史上任何时间点所做的改动。有了这个功能,一旦发生误操作,我们就可以及时进行数据恢复,很酷的一项功能。

Temporal Table要具备几个条件:

  • 必须有主键。
  • 必须定义两个数据类型为datetime2的列,用来记录开始和结束时间点。如果需要,可以使用HIDDEN标记隐藏这两个列。这两个列也称为SYSTEM_TIME时间范围列(periodcolumns)。
  • 历史表必须是和主表在结构上一模一样,包括字段名字和数据类型。
  • INSTEADOF触发器是不允许的,AFTER触发器仅能用于主表。
  • 不能用于In-momory OLTP。

下面一起感受一下该特性:

1.  创建经版本控制的系统(system-versioned)表:

[sql] view plain copy


  • CREATE TABLE dbo.TestTemporal  
  •     (ID int primary key  
  •     ,A int  
  •     ,B int  
  •     ,C AS A * B  
  •     ,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);  





如果没有指定历史表的名称,SQL Server会自动生成一个dbo.MSSQL_TemporalHistoryFor_xxx的历史表,其中xxx是主表的object id。历史表创建完成后,长得像下面这个样子,我们可以对历史表进行重命名,比如变成TestTemporal_History。

历史表的列与主表的列完全一样,但所有的约束会被移除。历史表可以有自己的索引和统计信息,在历史表上创建索引,比如clustered columnstore index,能够大幅改善性能。


2.   测试历史表的功能

首先insert几笔数据:

[sql] view plain copy


  • INSERT INTO dbo.TestTemporal(ID, A, B)  
  • VALUES  (1,2,3)  
  •         ,(2,4,5)  
  •         ,(3,0,1);  
  •   
  • SELECT * FROM dbo.TestTemporal;  

insert成功后,主表的数据如下:


现在对数据进行delete和update操作:

[sql] view plain copy


  • DELETE FROM dbo.TestTemporal  
  • WHERE ID = 2;  
  •   
  • UPDATE dbo.TestTemporal  
  • SET A = 5  
  • WHERE ID = 3;  





这时来查看主表和历史表的数据,可以看到历史表把主表变化前的数据记录了下来:


3.  更改system-versioned表的schema

当一个表启用了system-versioning时,对主表修改,就会有严格的限制。允许做?ALTER TABLE … REBUILD, CREATE INDEX,  CREATE STATISTICS, 但schema修改是不允许的。 下面的示例演示了,drop主表是不允许的。

但是,如果你需要对主表增加列,该怎么办呢?好办,可以依循如下步骤:

首先,禁用system-versioning:

[sql] view plain copy


  • ALTER TABLE dbo.TestTemporal SET (SYSTEM_VERSIONING = OFF);  




禁用之后,原先的主表和历史表,会变成我们熟知的主表,如下所示:


这时,你就可以对两张表进行修改,不过要确保张表表的一致性,为了演示,我对2张表同时增加了一列D。 修改完成后,可以通过下面的T-SQL启用system-versioning:

[sql] view plain copy


  • ALTER TABLE dbo.TestTemporal ADD PERIOD FOR SYSTEM_TIME([SysStartTime],[SysEndTime])  
  • ALTER TABLE dbo.TestTemporal SET (SYSTEM_VERSIONING = ON  
  • (HISTORY_TABLE=dbo.TestTemporal_History,DATA_CONSISTENCY_CHECK=ON)  
  • );  

刷新之后,就可以看到当前的样子:刷新之后,就可以看到现在的样子:





转自: http://blog.csdn.net/burgess_liu/article/details/51557520

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享
回复

使用道具 举报

131

主题

154

帖子

1161

积分

超级版主

机总

Rank: 8Rank: 8

积分
1161
QQ
沙发
发表于 2016-6-8 09:55:40 | 只看该作者
这个功能好,特别是在物料主档,色号主档等数据被修改后,可以找到原因。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|上海环思 ( 沪ICP备11022428号 )

GMT+8, 2024-9-17 09:32 , Processed in 0.076546 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表