2018-02-06

RETENTION on Temporal Tables

שלום לכולם
אכן הרבה זמן לא כתבתי, אשתדל לחזור לעצבי בקרוב.
והיום בקצרה על ניהול טבלאות temporal.
בקצרה ב SQL Server - החלו להשתמש ברעיון של שמירה אוטמטית של שינויים בנתונים בטבלה.
ואפשר לתשאל גם את הטבלה ההיסטורית וגם את הנוכחית בשליפה אחת:


/*State of entire table AS OF specific date in the past*/ SELECT [DeptID], [DeptName], [SysStartTime],[SysEndTime] FROM [dbo].[Department] FOR SYSTEM_TIME AS OF '2015-09-01 T10:00:00.7230011' ;

אחת הבעיות זה ניהול הטבלה ההיסטורית אי אפשר למחוק ממנה בצורה רגילה - ואצלי ב SQL Azure הדבר נהיה משמעותי עקב מגבלת הגודל.

לכן עלינו על נושא ה RETENTION שזה פיצ'ר מדהים שניתן בכל SQL Server ולהפתעתי גם ב SQL Azure.
יש אפשרות להגדיר כמה זמן יישמר המידע בטבלת היסטוריה.

כאשר יש סרביס מאחורה שרץ ומוחק מה שצריך ללא עומס מיוחד בבסיס הנתונים - לא הצלחתי להבין היכן זה רץ ומה חלונות הזמן שלהם.

הגדרה זו היא בשתי רמות, ברמת בסיס הנתונים שב Azure אתה מריץ את זה ב master.

--on master DB
ALTER DATABASE MyDB SET temporal_history_retention ON  

ואז ברמת הטבלה כולל הגדרה מה הזמן שאתה רוצה שיישמר

--on db
ALTER TABLE [MyDB ].[MyTable] 
SET (SYSTEM_VERSIONING = ON (HISTORY_RETENTION_PERIOD = 1 WEEK));

או שזה מוגדר לשמור לתמיד ככה:
--on db
ALTER TABLE [MyDB ].[MyTable] 
SET (SYSTEM_VERSIONING = ON (HISTORY_RETENTION_PERIOD = INFINITE));

ואז זה עובד כמו שאומרים - פצצות.

כדי לראות מה מוגדר לך לכל טבלה זו השאילתא:

SELECT DB.is_temporal_history_retention_enabled,
SCHEMA_NAME(T1.schema_id) AS TemporalTableSchema,
T1.name as TemporalTableName,  SCHEMA_NAME(T2.schema_id) AS HistoryTableSchema,
T2.name as HistoryTableName,T1.history_retention_period,
T1.history_retention_period_unit_desc
FROM sys.tables T1  
OUTER APPLY (select is_temporal_history_retention_enabled from sys.databases
where name = DB_NAME()) AS DB
LEFT JOIN sys.tables T2   
ON T1.history_table_id = T2.object_id WHERE T1.temporal_type = 2