[译]SQL SERVER 2016 – Temporal Tables

原文

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

Temporal table是如何工作的呢?

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

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

702742-20180208095631029-1408376410.png

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

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

702742-20180208095946295-796246366.png

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

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

702742-20180208100235076-1659416680.png

创建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

702742-20180208101237404-1172849819.png

执行insert

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

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

702742-20180208101542701-1993309391.png

执行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)
GOSELECT * FROM tbl_Product
GO
SELECT * FROM dbo.tbl_Product_History
GO

702742-20180208102123326-1652402508.png

执行delete

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

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

702742-20180208102239576-2041470871.png

执行select

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

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

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

702742-20180208102724357-2018826372.png

下面使用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

702742-20180208102922185-1292388599.png

下面使用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

702742-20180208103059545-1506427716.png

总结

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

转载于:https://www.cnblogs.com/irocker/p/sql-server-2016-temporal-tables.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyEclipse2015Stable2.0安装破解

java开发者不可避免需要使用到的开发工具——myeclipse2015。下载安装直接打开使用的话,使用期为30天,之后如果没有注册吗注册,就使用不了了。即使卸载重装还是提示试用期期限超限,无法打开使用。 于是就有了破解myeclipse2015方…

Android 上传图片实例,java上传图片接口

1、完整上传图片代码方法: private static final int TIME_OUT 10*1000; //超时时间 private static final String CHARSET "utf-8"; //设置编码 /*** android上传文件到服务器* param file 需要上传的文件* param RequestURL 请求的rul* return …

2、jeecg 笔记之 t:dictSelect 或 t:dgCol 自定义字典

1、需求 先说一下需求场景吧,我们知道 jeecg 中提供了下拉,其中包含两种使用场景; 一种是直接通过 t:dictSelect 使用,再就是 t:dgCol 用于表头的列表工具条标签; 总之就是这个样子 需求来了,我们想要下拉…

android动态切换logo和label

注&#xff1a;更新版本时。需换为默认的才可以更新apk android:enabled"true"为默认 1、准备资源 &#xff08;1&#xff09;logo和名称资源 <string name"app_name">httpheader</string> <string name"app_name1">第二名&…

3、jeecg 笔记之 模糊查询

1、前言 jeecg 考虑到默认模糊查询的话&#xff0c;会增加系统压力&#xff0c;导致查询慢&#xff0c;本来系统就挺那啥的... 2、方式一之实体赋值 实体重新赋值查询&#xff0c;用 * %% * 实现&#xff0c;我们知道 sql 中通常使用 % 去模糊查询的&#xff0c;jeecg 中 datag…

工作235:splice

const user res.data.user;const dept user.department;console.log(dept.property)const properties dept.property.split(",");console.log(properties) 运行结果

java打印三角形,菱形。任意边长大小

一、等腰三角形 for (int j 0; j < num; j) { if (j > 0) { for (int i 0; i < j; i) { if (i j - 1) { for (int k 0; k < num - j; k) { if (k num - j - 1) { Syst…

工作236:点击直接进入

<div class"container"><!-- <el-radio-group v-model"mode">--><div><!-- <el-radio-button class"login-btn" label"0">营销端</el-radio-button>--><el-button class"login-b…

java spring框架使用实例demo

首先导入spring的jar包 1、创建web项目&#xff0c;创建spring.xml文件 注&#xff1a;base-package即是包名 spring.xml详情&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <!-- 查找最新的schemaLocation 访问 http://www.springfram…

2、Flutter 填坑记录篇

1、前言 之前写了一篇文章关于 flutter 初体验的一篇&#xff0c;https://www.cnblogs.com/niceyoo/p/9240359.html&#xff0c;当时一顿骚操作&#xff0c;然后程序就跑起来了。 隔了好一段时间&#xff0c;换了个电脑&#xff0c;重新装了个AndroidStudio&#xff0c;继续搭建…

工作238:Vue.js中this.$nextTick()的使用

this.$nextTick()将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它&#xff0c;然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样&#xff0c;不同的是回调的 this 自动绑定到调用它的实例上。 假设我们更改了某个dom元素内部的文本&#xff0c;而这时候我…

拉勾网大数据相关岗位数据爬虫分析

拉勾网大数据相关招聘数据分析 观察对象&#xff1a;大数据相关岗位的招聘数据 观察时间&#xff1a;2016.3.28 数据来源&#xff1a;拉勾网 1、分析目的 眼下&#xff0c;大数据是一个非常热门的话题。受到非常多人的关注和追捧。其创造的相关职业也受到大家的青睐。但大数据相…

2018--20179215--《文献管理与信息分析》第三讲 英文数据库资源的发展趋势和利用...

《文献管理与信息分析》第三讲 英文数据库资源的发展趋势和利用 一、科研相关的文献资源有以下十大来源&#xff1a; 专利、会议论文、期刊、学位论文、科技报告、科技档案、产品资料、政府出版物、标准文献、图书。 二、数据库的使用 1.不同搜索引擎的差异&#xff1a; 覆盖的…

工作239:内容过长省略号失败 直接改的样式表

给元素加入以下样式&#xff1a; white-space:nowrap;overflow:hidden; text-overflow:ellipsis; 此外&#xff0c;还要注意给元素加上宽度&#xff1a; width:100px;

Android身份证识别demo,文字识别

百度云链接&#xff1a;https://console.bce.baidu.com/?fromai1#/aip/overview 1、1首先去百度文字识别创建应用&#xff0c;获取ak和sk 配置ak和sk 1、2 jniLibs文件夹复制过去 2、识别身份证信息方法&#xff1a; /**** 解析身份证图片** param idCardSide 身份证正反面*…

jq消除网页滚动条

网页有些时候需要能滚动的效果&#xff0c;但是不想要滚动条&#xff0c;我就遇到了这样的需求。自己用jq写了一个垂直滚动条。 纯css也可以实现 .box::-webkit-scrollbar{display:none} 但是edge和Firefox不兼容&#xff0c;自己想了一下只要监听滚轮事件&#xff0c;用jq写应…

5、Flutter 实现 ViewPager、bottomNavigationBar 界面切换

1、前言 首先我们想一下&#xff0c;如果在 Android 中实现 布局切换&#xff0c;通常的思路是&#xff1a; 做一个 viewpager一组 Fragment每个 Fragment 绑定一个 xml最后填充至 viewpager2、Flutter 实现 上边提到的用安卓原生做&#xff0c;思路是很明确&#xff0c;但是代…

Android 应用内实现导航页面,接入百度SDK内置导航,高德SDK内置导航

1、首先到百度地图开放平台创建应用&#xff0c;获取应用AK http://lbsyun.baidu.com/apiconsole/key 2、到百度语言平台创建应用&#xff0c;获取Secret Key和语言APP ID http://yuyin.baidu.com/app 3、到百度地图开放平台下载Android 导航SDK https://pan.baidu.com/s/1z…

6、Flutter Error waiting for a debug connection: ProcessException: adb did not report f(转)

1、错误信息 Error waiting for a debug connection: ProcessException: adb did not report forwarded port 2、解决方法 升级adb&#xff0c;其实是更新SDK Platform-Tools就可以了。 步骤&#xff1a;打开 Android SDK >>> SDK Tools 勾选 Android SDK Flatform-…

前端学习(2710):重读vue电商网站30之左侧菜单栏图标设计

我们想要的效果如下&#xff1a; 如何设计&#xff1f; 首先&#xff0c;我们可以在 data 中定义一个对象&#xff0c;对应于每一个菜单选项的 id 然后通过 for 循环遍历每一个菜单选项的 id即可。