SQL SERVER 很有意思2016 推出一个历史版本控制的功能,这个功能的含义在于帮助数据表在操作中根据时间来进行曾经操作的记录,实际上等同于
先不吐槽这个功能在设计的初期有没有毛病,但我们的的确确是遇到了,并发高,同时有回滚的时候,造成时间线出现问题,倒是任务无法执行的问题。虽然是少量的,但这个功能其实也有不严谨的地方。
具体这个功能怎么开启,使用,这里就不说了,这里要说的是数据怎么清理,因为存储的是一个行曾经的历史活动,所以他的数据量一般是数据表频繁修改过的匹配,也就是N条你曾经的数据。
废话不说先做几个,测试我们先来领会一下这个功能,历史版本控制表,在建立的时候,会有两种,如果建立成另一种则会给后面的自动化数据定期清理造成一定的麻烦。所以上面给出的图形,是两个一个是给定名字,一个是不。
插入数据,修改数据,查看历史版本控制表
通过上图也就会明白,这个历史版本控制的需求,
1必须的有主键,否则你怎么能知道一行变化并确认
2 必须的有时间字段,以及变化的开始时间和变化的结束时间,并且行改变的开始时间是他的sysendtime 时间,而他与他主键一致,时间点在sysstarttime一致的是sysstarttime 从上图我们就可以看出。
3 在有历史版本控制表与原表工作的时候,有一些操作是被禁止的
例如上面的操作。
下面我们的直奔主题了,怎么清理这些历史版本的数据,其实处理起来很简单,主要是你要在处理的时候,解除历史版本控制表与主表之间的关联,让其变成一个与实体表无关的表,然后就可以任你“宰割”了
在处理完毕后,我们在将他与原表进行挂载,继续为我们工作,但在这段期间数据表操作的数据变化不会记录到我们的历史版本控制表。并且历史版本控制表,只记录UPDATE 和 Delete 的操作。
但如果和上面说的,如果你在操作的过程中,你建立历史版本控制表的时候,没有给表名,则你每次进行上面的操作的时候,一开 一闭,你的SQL SERVER 会将你的历史版本表的表名进行变化,这虽然没有什么问题,但对你自动化的清理历史表的数据有一定的难度,所以建议还是给一个名字,降低以后自动化处理的麻烦。或者你在
alter table XXXX set (system_versioning = on ) (history_table = 你要设定的历史版本表名) 也可以纠正你曾经因为没有设置表名而历史版本表名很随意的问题。
当然也有自己创建自己的历史归档表的方式,然后挂载自己创建的历史归档表,但需要注意的是,这样建立的表在聚簇和非聚簇索引的需求,(大白话就是主键,和 相关事件字段与主键的索引)你要自己处理好.
那么自己写一个定期处理的他的存储过程,会是一个很方便的事情。
另这样的表在某些操作上都会和普通的表不一样,
例如删除一个表,需要先解除实体和历史版本控制表之间的关系,然后在分开删除表。
具体的还请看官方文档
https://docs.microsoft.com/en-us/sql/relational-databases/tables/creating-a-system-versioned-temporal-table?view=sql-server-2016
本文分享自 AustinDatabases 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!