
datetime2 (בדוגמה ברזולוציה של 7 ספרות) שמוגדרות GENERATED ALWAYS AS ROW START ו-ROW END, פסוקית PERIOD FOR SYSTEM_TIME שמצביעה עליהן, SYSTEM_VERSIONING = ON, ומפתח ראשי בטבלה.ProductID מסוג int ו-identity ומפתח ראשי, ProductName, UnitPrice מסוג money ושתי עמודות הזמן. אפשר להוסיף HIDDEN לעמודות הזמן כדי שלא יופיעו ב-SELECT רגיל.UPDATE או DELETE.FOR SYSTEM_TIME עם AS OF לתאריך מסוים, FROM ... TO, BETWEEN, CONTAINED IN או ALL. כל האפשרויות מופיעות בתיעוד של מיקרוסופט.UNION בין הטבלה לטבלת ההיסטוריה.AS OF צריך לתת תאריך ברזולוציה שמתאימה לעמודות הזמן.הטקסט המלא של הדקות הראשונות בהרצאה «טבלת Temporal» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
בשיעור היום נכיר יכולת חדשה של sql, יכולת החל משנת 2016, sql server 2016. היכולת לבנות לנו טבלה בעלת עומק, טבלה השומרת לנו לא רק נתונים אחרונים בלבד, אלא יכולה לשמור לנו עומק היסטורי.
לפני שנכיר את הרכיב הזה, בואו נחווה רגע את המשמעות של הדברים. כשאנחנו מסתכלים כאן בתוך ה-sql שלי, אז יש כאן טבלאות, אתם רואים את הסימון שלהם של טבלה בעצם דו-ממדית.
טבלה זאת, כמו טבלת קסטומר, כל שינוי שאני עושה דורס את הערך הקודם שלו, מבלי שום יכולת לשחזר את הערך הקודם שהיה כאן. אם אני ארצה לדעת מה היה הערך לפני השינוי, אין לי שום משמעות, מאחר שהשינוי שעשיתי עכשיו, שהוספתי את המילה new, נשמר בתוך הדאטאבס ואין לי יכולת לשחזר זאת.
אולם, החל משנת 2016, SQL פיתח טבלאות חדשות, מבנה טבלה חדש שימו לב לאייקון טבלאות הללו נקראות סיסטם ורז'נד כפי שאני עומד כאן וכפי שברגע שאני עומד עולה לי הפופ-אפ שמציין לי את שם הטבלה ובסוגריים עגולות הוא מציין לי זאת טבלה מסוג סיסטם ורז'נד האייקון זה גם מבנה דו-ממדי של טבלה אבל יש עליו שעון זאת אומרת שכל רישומה
כרגע יש בתוכה עומק טבלאי בואו נרגיש את הפיצ'ר הזה ניכנס לתוך הגוגל טמפורל טייבל של sql server אז זהו פיצ'ר כפי שציינו החל משנת 2016 פיצ'ר חדש המאפשר לנו בעצם לשמור עומק טבלאי על מנת לדעת בפוינט אוף טיים לדעת בעצם מה נכונות הנתונים שלי בכל רגע נתון גם בהתפלגות של זמן אחורה.
טמפורל טייבל בעצם אנחנו יוצרים ורז'ן טייבל את זה אנחנו תכף נראה ויש יש כאן מנגנון שבו אנחנו יכולים לתשאל את הטבלה שלי, לשאול אותה על רשומות אחורה ולראות כיצד אנחנו עושים זאת.
בדמו הבא אני רוצה להדגים זאת. בואו ניצור דאטאבס טמפורל טייבל. יצרנו דאטאבס טמפורל טייבל, כמובן שהשם כרגע לא עוזר לנו כלום, ואנחנו רוצים ליצור בתוכו טבלה, קריאט טייבל.
מעניין מאוד שברגע שיצרנו כאן דאטאבס בתוך המערכת שלנו, מבחינת הוויזארד אם אני רוצה להוסיף כאן טבלה כשאנחנו יוצרים כאן את הטבלה אז כבר הוסיפו לנו את האפשרות באדיטורים החדשים טמפורל טייבל פיצ'ר של טמפורל טייבל אנחנו יכולים ליצור סיסטם ורז'ן טייבל הדבר הזה נתמך ברמת הגוי ויש לנו גם אפשרות ללכת
ולכתוב אותו ברמת הsql בואו ניכנס רגע ונראה קיבלנו כאן איזושהי תבנית איך למלא את הטבלה אבל אני נכנס כרגע לטורף הסקריפט עצמו ובואו נשים לב לשינויים הנדרשים.
ב-Temporal Table, בטבלה שבו אנחנו רוצים בעצם לשמור היסטוריה, אז אנחנו חייבים להוסיף שתי עמודות. עמודות Period Start Column Name ו-Period End Column Name.
עמודת התחלה ועמודת סוף, לא משנה מה השם שלהם, כן משנה ששתיהם יהיו בדאטה טייפ של Daytime. במקרה הזה בחרנו Daytime 2 ברזולוציה של 7 מקומות, 7 ספרות בחלוקה של שניות.
ואנחנו עושים Decorated, מוסיפים עוד איזה Attribute לאותה עמודה, שהיא בעצם Generate Always as Row Start, ומנגד לעמודה השנייה, Generate Always as Row End.
זו תוספת ראשונה שאנחנו צריכים לציין עבור טבלת Temporal Table, טבלה שמציינת לנו עומק טבלאים. נוספת שנייה, אנחנו צריכים לציין שה-period of system date, כלומר החלוקה של הזמנים שלנו, מה היא צריכה להיות?
לציין את אותו שדה התחלה כפי שכתבנו אותו יחד עם השדה של הסיום, period end date. זה הדברים שאנחנו צריכים לציין, עד כאן שני ציונים.
דבר נוסף, בסיום כתיבת הטבלה, חלק מה-weave, חלק מהפרמטרים שאנחנו צריכים לתת מהסטים של הטבלה עצמה, צריך לציין SystemVersioning שלה שווה ל-on. יש כאן עוד כמה דברים, אבל הם בהחלט אופציונליים.
עד כאן זה הדברים המנדטוריים, ואני חוזר עליהם. דבר ראשון בתוך הוויב, לציין SystemVersion שווה ל-on. לציין שתי עמודות תקורה עבור תחילת תוקף הרשומה וסוף תוקף הרשומם.
לציין את הפסוקית Period of System Time. ויש גם עוד דבר אחד נוסף, כל טבלת טמפורל טייבל חייבת שיהיה לה מפתח פריימרי כי מזהה חד ערכי. בואו ניצור את הדבר הזה, קריאט טייבל, אנחנו ניצור כאן את טבלת פרודקטס.
על מנת ליצור את הרישומות עצמם, אז אנחנו ניצור כאן את product ID, הוא יהיה מסוג אינט, ועליו אנחנו נציין שהוא יהיה אידנטיטי ברמה של 1.1 והוא יהיה גם פריימרי כי.
אז בזאת קיימנו את הדרישה הראשונה שיהיה לנו עמודה אחת שהיא בעצם המפתח המזהה חד ערכי של הטבלה. אנחנו ניצור לעצמנו גם את product name שהוא יהיה מסוג varchar מספיק בגודל הנדרש הוא גם יכול לקבל null זה לא מפריע לנו.
ונציין כאן את ה-unit price את המחיר שהוא בעצם נשמר לנו כ-money עמודת מחיר ואנחנו חייבים לציין עוד שתי עמודות כפי שנציין לנו כאן הטקסט עצמו.
בואו נעביר את זה לכאן, נדביק. אז שתי העמודות הללו, בדיוק מה שרשום כאן בין הסוגר סימן קטן לסימן גדול, זה הקונבנציה של מייקרוספקט שבה היא אומרת לנו, ראשית בחלק הראשון זה תיאור של מה שצריך להיות כאן,
בחלק השני זה מה הדאטה טייפ שלו, ובחלק השלישי זה דוגמה למשהו שהיה יכול להיות אפשרי. אז אנחנו ניקח את הדוגמה הזאת, נשתמש בה ונשים אותה בחלק הזה אז אם כן הגדרתי כאן עמודה ששמה זה סיס סטארט דיים דאטה טייפ שלה זה דאטה עם שבע אני אקח את ההמלצה שלה והיא בעצם תציין לי שהיא generate always as row start ואנחנו גם יכולים לציין לה שהיא
בעצם hidden כלומר אני יכול לכתוב שהעמודה עצמה היא כרגע hidden אז יש לי אפשרות לכתוב כאן את המילה hidden כלומר או שבשליפה רגילה, אם לא נכתוב אותה, אז היא לא תופיע לנו בשליפה.
באותה צורה אנחנו גם נעשה את העמודה הזאת של ה-סיס אנד דייט טיים. היא תהיה מסוג דייט דייט, ג'נרייט. אנחנו כאן שוב פעם נציין שהיא הידן, נמחק כאן.
ולא נשכח להוסיף את החלק הזה פריוד אוף סיסטם טייפ, שבעצם בוא, הוא אומר לנו מה בעצם הסיסטם טיים שאיתם אנחנו הולכים, כלומר מהם שתי העמודות הרלוונטיות.
אז אני רושם לו ששתי העמודות הן העמודות בהתאמה שציינו, סיס דייט סטארט וסיס דייט אנד, ובכך סיימנו את יצירת הטבלה שלנו.
אז הרי שלפנינו טבלה, ויש בה שתי עמודות שמציינות לי התחלה וסוף. על אחת מהן ציינתי עידן, גם על השנייה. אולי שווה דווקא בהתחלה לא לכתוב את זה כדי שבשליפה הם יצאו לנו, ורק אחר כך נכניס את האפשרות הזאת, את האטריביוט הזה, כדי לא להציג אותם.
ואני כאן מציין שבכל שליפה אנחנו מתחילים ב-StartDate ו-EndDate, הם בעצם מציינים לנו את ההתחלה ואת הסוף. רק מה שאנחנו חייבים כאן לציין, שאנחנו בעצם מדברים על SystemVersioning שהוא שווה ל-On.
אז הטבלה שלנו כרגע מוכנה ואנחנו כבר יכולים ליצור אותה. כדי ליצור את זה, אז בואו נתחבר לתוך ה-Database שאותו עכשיו יצרנו.
זה בעצם Use. נתחבר ל-Database. ניצור את הטבלה וכעת יש לנו בטבלה בעצם מנגנון ששומר לנו היסטוריה של נתונים בואו נרגיש זאת insert into product מה אנחנו רוצים להכניס אני מציין את העמודות בהתאמה אנחנו רוצים להכניס את product name ואנחנו רוצים להכניס את unit price בהתאמה בואו נכניס את הערכים
עצמם values ונמלא אותם בהתאמה לפי הבקשה שלנו בואו נכניס כבר רשומות, יש לנו כאן את המילק והמחיר שלו יהיה 5.6, לאחר מכן נכניס מוצר אחר, את הטופו, שהמחיר שלו 3.5, ואילו כאן נציין את המוצר החדש שלנו,