[SQL]Temporal 異常處理經驗
阿新 • • 發佈:2018-12-21
解決20762 Module 3 課程關於Temporal Table 在 Demo 時的錯誤
首先該Demo 主要是搭配AdvantureWorks2016 的資料庫,使用Person.Person 這個資料表來做展示,看起來沒有太大的問題,因此為了在既有的資料表上面要轉換為Temporal Table ,該展示採用以下的Script 來進行
今天比較靜下心來看這個問題,其實主要的問題有幾點:
1.這個既有的Person.Person的資料表是有資料的,因此本來用在CREATE上的時候沒有問題,但採用ALTER增加欄位的時候,因為會牽涉到欄位的值是NULL ,因此採用DEFAULT的方式填入預設值。
2. SYSTEM_TIME所填入的欄位值應該是UTC的時間,但是用SYSDATETIME()所取得資料是精確的當地時間,因此以我的環境來說,這個時間會比UTC時間多八個小時,因此會造成異常。
因此如果上述的指令要修改,則可以改成以下的語法,這樣就可以順利地執行了
設定好SYSTEM_TIME 欄位後,就可以透過下面的指令來指定歷史資料表
ALTER TABLE Person.Person SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = Person.Person_History)); GO
另外一個在介紹Temporal的時候沒有注意到的,就是由於在SQL Server 2016版本提出的時候,針對歷史資料的清除時,只能先透過指令將資料表的
而這樣的方式,在SQL Server 2017 和Azure SQL Database 上,有了更方便的方式,首先要在資料庫上面開啟歷史資料清除的功能
ALTER DATABASE AdvantureWorks2016 SET TEMPORAL_HISTORY_RETENTION ON
接著在資料表上,只要搭配 HISTORY_RETENTION_PERIOD的引數,設定好資料保留的期限,那其他你就不用自己去處理了,在下面範例中,我們設定資料只保留一個月
ALTER TABLE Person.Person SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = Person.Person_History, HISTORY_RETENTION_PERIOD = 1 MONTHS))