Temporal Table是在SQL SERVER 2016推出後新加的功能,Temporal Table主要功能是紀錄Table歷史資料,Temoral Table會記錄每一筆每一時刻異動的資料。新版的EntityFramework Core也有Temporal Table的功能。Temporal Table主要有以下這些功能
Auditing: 對於一些產業如金融或醫療可以追蹤歷史紀錄,看是否有新增或刪除資料。
History Data Analysis: 可以分析一些公司產品歷史紀錄,來判斷產品銷售紀錄(尤其在哪一時段)。在分析股票行情也有用。
Data recovery: 例如銀行有些業務異常或特殊形況下,可追蹤歷史資料來復原資料錯誤。
範例:
建立資料表
先新建table和它的temporal table。Table schema如下。表名稱為BookInventory,而此table的temporal table為dbo.BookInventoryHistory,BookInventoryHistory是System-Versioned,System-Versioned意思是指SQL SERVER會自動產生和維護Historical Table。
GENERATED ALWAYS AS ROW START: 資料列的起始效期
GENERATED ALWAYS AS ROW END: 資料列的結束效期
PERIOD FOR SYSTEM_TIME :代表效期的起始與終點
SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.BookInventoryHistory): 啟用 Temporal Table生效, Temporal Table為 BookInventoryHistory.
加入資料
BookInventory先加入兩筆資料。
dbo.BookInventory
dbo.BookInventoryHistory
加入兩筆資料後,分別觀察BookInventory表和它的temporal table(BookInventoryHistory)。BookInventory表已有這兩筆資料,但BookInventoryHistory還尚未有剛Insert這兩筆資料。那是因為BookInventory第一步是Insert,要等到下一步如Update,才會將原先BookInventory這兩筆資料加入BookInventoryHistory(Temporal table)。
更新資料- Step 1
dbo.BookInventory
dbo.BookInventoryHistory
更新原table( BookInventory)的兩筆資料後,原BookInventory表已有更新過那兩筆資料。接者我們也看到BookInventoryHistory表已有原兩筆被Update前的資料。SysStartTime為原始資料生成時間,SysEndTime為Update(異動)時間。
更新資料- Step 2
dbo.BookInventory
dbo.BookInventoryHistory
我們再測試Update data後的結果。這次異動的資料為兩筆,所以這次BookInventoryHistory表應有四筆資料(上次update兩筆加上這次update後兩筆)。執行update如預期。BookInventoryHistory可追蹤每次update後的資料結果,包含異動時間。
刪除資料
dbo.BookInventory
dbo.BookInventoryHistory
這次我們刪除一筆資料來測試Temporal Table。在執行Delete刪除資料後,BookInventory表只剩一筆資料(另一筆已刪)。我們再看BookInventoryHistory表,發現5筆資料。新增的一筆為剛刪除前的資料,包含此資料生成(update)和刪除(delete)的時間。
追蹤資料
dbo.BookInventory
指在 ‘2024-09-02 02:23:57.3447172’ 時間點有效的數據
結論
Temporal Table也有侷限性,像是Temporal Table不允許constraint,且Temporal Table也需要額外記憶空間,效能設定也較複雜,但它在追蹤歷史異動資料是很方便的。在Sql Server 2016之前可能要用Trigger或Store Procedure來追蹤歷史異動資料。下篇會介紹EntityFramework Core關於Temporal Table生成和應用。
參考資料
Microsoft Docs, “Temporal Tables“
Pluralsight Couse Querying Data in EF Core– Temporal Tables
The importance of traceability of changes, https://itequia.com/en/table-versioning-in-sql-server-what-is-it-and-how-does-it-work/