[译]SQL SERVER 2016 – Temporal Tables
原文
Temporal Table是SQL Server2016的新特性。能存儲你表里面任意時間點的數(shù)據(jù)信息。 換句話說,如果你針對一張表執(zhí)行任何更新或者刪除操作,老數(shù)據(jù)會被新數(shù)據(jù)覆蓋,下次查詢的時候是查的最新的數(shù)據(jù),但如果使用了temporal table你可以查詢到任意時間點的數(shù)據(jù)。
Temporal table是如何工作的呢?
當你往Temporal table插入記錄的時候會發(fā)生什么?
當你往temporal table插入數(shù)據(jù)的時候,數(shù)據(jù)會留在temporal table中,但是不會影響history table。
當你更新或者刪除Temporal table的數(shù)據(jù)時會發(fā)生什么?
當你更新或者刪除Temporal table的數(shù)據(jù)時,已存在的記錄會先被移動到history table中,記錄temporal table數(shù)據(jù)的改變。
當你查詢Temporal table的時候會發(fā)生什么?
當你查詢temporal table的時候, temporal table會自己決定是從temporal table中還是從history table中返回數(shù)據(jù),你不應該使用任何join關聯(lián)temporal table和history table進行查詢。
創(chuàng)建Temporal Table
創(chuàng)建temporal table時,其對應的history table會自動創(chuàng)建(如果你已經(jīng)有了一個history table,你可以將他和temporal table關聯(lián)起來)。下面是一個普通的創(chuàng)建表的腳本,但是有些額外特殊的列。這些列用來定義temporal table的period definition,并且這些列是隱藏的。當你查詢的時候這些列不會出現(xiàn)在結果集中。腳本中還將history table名指定為“dbo.tbl_Product_History”。當然你也可以不聲明history table的名字,SQL會自動為temporal table創(chuàng)建一個默認的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執(zhí)行insert
之前說過,當你對一個temporal table執(zhí)行insert語句,不會影響history table。下面我們執(zhí)行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執(zhí)行update
當你對一個temporal table執(zhí)行update語句,老數(shù)據(jù)會被移到history table中,temporal table會保存最新的數(shù)據(jù)。下面我們執(zhí)行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執(zhí)行delete
當你對一個temporal table執(zhí)行delete語句,老數(shù)據(jù)會被移到history table中,temporal table會保存最新的數(shù)據(jù)。下面我們執(zhí)行delete,然后看看相應的結果。
USE SampleDB GO DELETE FROM tbl_Product WHERE Product_ID = 2 GOSELECT * FROM tbl_Product GO SELECT * FROM dbo.tbl_Product_History GO執(zhí)行select
在temporal table中執(zhí)行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’ 時的狀態(tài)。
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’時的狀態(tài)。
USE SampleDB GO SELECT * FROM tbl_Product FOR SYSTEM_TIME AS OF '2015-06-27 21:43:31.2982847' GO總結
有了temporal table,將改變我們?yōu)閿?shù)據(jù)倉庫設計數(shù)據(jù)庫的方式。因為我們不需要創(chuàng)建一個獨立的audit表通過觸發(fā)器或者存儲過程記錄數(shù)據(jù)的變化,temporal table自動為我們完成了這些工作。
轉載于:https://www.cnblogs.com/irocker/p/sql-server-2016-temporal-tables.html
總結
以上是生活随笔為你收集整理的[译]SQL SERVER 2016 – Temporal Tables的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php收费视频网站实现,超好影视网站PH
- 下一篇: 使用mysql事件_MySQL事件的使用