SQL server temporal table 学习笔记
refer:
https://blog.csdn.net/Hehuyi_In/article/details/89670462
https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-ver15
https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-table-usage-scenarios?view=sql-server-ver15https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-table-usage-scenarios?redirectedfrom=MSDN&view=sql-server-ver15
ef 目前不支持哦 (https://github.com/dotnet/efcore/issues/4693)
https://blog.51cto.com/zhouhuo/1980310
https://www.cnblogs.com/irocker/p/sql-server-2016-temporal-tables.html
temporal table 是 2016 后有的.
目的是做 history 管理.
数据嘛, 一直 update delete. 有时候发现问题想 check back history 从前我们需要自己维护, 设计表记入资料等等.
挺麻烦的,而已也没有规范.
好像是 2011 年后有个规范了. 然后 2016 sql server 就实现了这个规范. 就是这个 temporal table 了。
这个 version control 的机制实现方法就是为一个表做多一个 history 表
当原表发生修改时, 就计入到 history 表里面. 除了多一个表以外, 还有 2 个重要的 column 是 SysStartTime 和 SysEndTime
通过时间管理, 就可以还原任何时间点的数据快照了。
结构有了之后就是语句啦. sql server 有一些特定的语法可以轻松的 query 出历史数据.
做业务开发的我们不需要懂底层太多, history sql server 会自己维护, 我们 query 的时候也是通过特定语法直接从主表查询. 所以基本上对 history 表是没有什么感知的.
下面来试试看 :
首先 management studio 没有 ui 可以直接创建 temporal table. 但是它可以做一个 template query 来弄.
这里我简单写点测试就好
创建一个表
create table dbo.Abc
(
Id int not null IDENTITY(1,1) PRIMARY KEY CLUSTERED ,
name nvarchar(120) not null,
age int not null,
SysStartTime datetime2 GENERATED ALWAYS AS ROW START,
SysEndTime datetime2 GENERATED ALWAYS AS ROW END,
PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)
)
with (system_versioning = on (history_table = dbo.AbcHistory));
SysStartTime 和 SysEndTime 是必须的, 然后它是 datetime2 UTC 时间, 不可以设置成 datetimeoffset
如果想依据 timezone 来查询, 可以参考 https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-table-usage-scenarios?redirectedfrom=MSDN&view=sql-server-ver15
来试试跑些语句
insert into dbo.Abc (name, age) values ('keatkeat', 11);
update Abc set name = 'tamade' where Id = 1;
update Abc set name = 'tamade' where Id = 1;
insert 之后, start time 是当前时间, end time 是 9999 年, history 不会有任何资料
update 之后 start time 就更新了, 然后 history 就出现了一条 row, 这条 row 有之前的 value keatkeat 和 那个 row 的 start time, end time 就是当前.
再 update 多一次的话 (哪怕没有改到) history 也是会多一条 row 的, 时间 formula 和上面一样.
delete 和 update 差不多, hisotry 多一条 row.
-- 主表的 end time 不知道有什么用, delete by used 怎样记入呢
查询的话很简单, 对主表 query 加上时间就可以了
指定时间
select * from Abc for system_time as of '2020-12-29 08:32:51.5585273'
多个指定时间
select * from Abc for system_time contained in ('2020-12-29 08:32:51.5585273', 2020-12-29 08:35:51.5585273)
between
select * from Abc for system_time between '2020-12-29 08:32:51.5585273' and '2020-12-30 08:32:51.5585273';
要 drop table 的话需要先 off
alter table dbo.Abc set (system_versioning = off);
drop table Abc;
大部分 alter table 的操作都是会自动同步到 history 的, 但有些不会啦. 以后真的用的时候才研究.
SQL server temporal table 学习笔记的更多相关文章
- sql server自定义函数学习笔记
sql server中函数分别有:表值函数.标量函数.聚合函数.系统函数.这些函数中除系统函数外其他函数都需要用户进行自定义. 一.表值函数 简单表值函数 创建 create function fu_ ...
- SQL Server物化视图学习笔记
一. 基本知识 摘抄自http://www.cnblogs.com/kissdodog/p/3385161.html SQL Server索引 - 索引(物化)视图 <第九篇> 索引视 ...
- 数据库(sql server 2000)—— 学习笔记1
一.安装 安装程序一般都是四合一的,SQL Server 2000有四个版本:企业版.标准版.个人版.开发版,每个版本的对系统的要求各不相同. SQL Server 2000各版本 对 操作系统的要求 ...
- sql server 2016 JSON 学习笔记
虽然现在win服务器已经几乎不用了,但是网上看到2016开始原生支持json 还是想试试 建立一个表 id int , json varchar(2000) json字段中输入数据 {"r ...
- SQL SERVER 常用函数 学习笔记
1.字符串截取.字符串转数字 --Server.8.30 select SUBSTRING('SqlServer_2008',4,6) as DB, CONVERT(float,SUBSTRING(' ...
- 《SQL 反模式》 学习笔记
第一章 引言 GoF 所著的的<设计模式>,在软件领域引入了"设计模式"(design pattern)的概念. 而后,Andrew Koenig 在 1995 年造了 ...
- mysql与sql server参照对比学习mysql
mysql与sql server参照对比学习mysql 关键词:mysql语法.mysql基础 转自桦仔系列:http://www.cnblogs.com/lyhabc/p/3691555.html ...
- SQL Server中Table字典数据的查询SQL示例代码
SQL Server中Table字典数据的查询SQL示例代码 前言 在数据库系统原理与设计(第3版)教科书中这样写道: 数据库包含4类数据: 1.用户数据 2.元数据 3.索引 4.应用元数据 其中, ...
- SQL Server 2008 R2——学习/练习/错误/总结/搜集
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- sql server 存储过程的学习
存储过程学习笔记 存储过程就是一条或者多条sql语句的集合,为了实现特定任务,而将一些需要多次调用的固定操作语句编写成程序段,这些程序段存储在服务器上,有数据库服务器通过程序来调用.T_SQL:存储过 ...
随机推荐
- CaiT:Facebook提出高性能深度ViT结构 | ICCV 2021
CaiT通过LayerScale层来保证深度ViT训练的稳定性,加上将特征学习和分类信息提取隔离的class-attention层达到了很不错的性能,值得看看 来源:晓飞的算法工程笔记 公众号 论文: ...
- 拯救SQL Server数据库事务日志文件损坏的终极大招
拯救SQL Server数据库事务日志文件损坏的终极大招 在数据库的日常管理中,我们不可避免的会遇到服务器突然断电(没有进行电源冗余),服务器故障或者 SQL Server 服务突然停掉, 头大的是l ...
- <el-table-column prop="item_no" label="料号"/>设置最小宽度
可以通过min-width属性来设置el-table-column的最小宽度.以下是一个示例: <template> <el-table :data="tableData& ...
- 推荐几款.NET开源且功能强大的实用工具,助你提高工作开发效率!
前言 俗话说得好"工欲善其事,必先利其器",今天大姚给大家推荐8款.NET开源且功能强大的实用工具,助你提高工作开发效率! DevToys 一款基于C#开源(MIT License ...
- 把python中的列表转化为字符串
怎么把python中的列表转换为字符串: 1,列表中非字符串的元素的转换 方法一: 使用列表推导式进行转换 1 list=['hello',6,9,'beizhi'] 2 list=[str(i) f ...
- 70%的人都答错了的面试题,vue3的ref是如何实现响应式的?
前言 最近在我的vue源码交流群有位面试官分享了一道他的面试题:vue3的ref是如何实现响应式的?下面有不少小伙伴回答的是Proxy,其实这些小伙伴只回答对了一半. 当ref接收的是一个对象时确实是 ...
- 从.net开发做到云原生运维(三)——.net core的学习路线
1. 前言 前面几篇文章主要讲了.net技术相关的基本概念和一些涉及的项目什么,本身也没讲太多底层的技术,这篇文章依旧不讲具体的技术,主要介绍.net技术的学习路线.学习路线也是我18年毕业的时候看到 ...
- 英语表达中address和solve的区别
"Address" 和 "solve" 都表示处理问题,但在具体用法和含义上有所不同: Address: 含义: 处理.应对.讨论或提及问题. 强调: 关注并开 ...
- 网络文件系统nfs服务端配置客户端权限时的demo例子
参考: https://www.cnblogs.com/devilmaycry812839668/p/15127755.html 由上面的参考资料我们可以知道在nfs服务端进行配置时对于客户端的权限设 ...
- 如何使用Python环境下的2D经典游戏仿真器(openai推出的)retro库运行游戏"刺猬索尼克" (SonicTheHedgehog-Genesis)
很多资料上都有使用游戏仿真器(openai推出的)retro库运行游戏"刺猬索尼克" (SonicTheHedgehog-Genesis),但是均没有给出详细的安装该款游戏的步骤 ...