1. 程式人生 > >[SQL]Temporal 異常處理經驗

[SQL]Temporal 異常處理經驗

解決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版本提出的時候,針對歷史資料的清除時,只能先透過指令將資料表的  

SYSTEM_VERSIONING = OFF,此時就可以自己手動去清除歷史資料表內過期的資訊了,當刪除完畢之後,再重新透過  SYSTEM_VERSIONING = ON的方式,並重新指定歷史資料表的名稱,這樣才可以將歷史資料清除。

而這樣的方式,在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))