
OnPreExecute ו-OnPostExecute.ID מסוג integer ו-identity, עמודת package ID, עמודת start date ועמודת end date. ה-package ID הוא מחרוזת, ולכן נבחר nvarchar בגודל 1000, ותאריכים הם datetime. סוגי הנתונים נבדקו בתיעוד של System Variables.?, לשדות package ID ו-start date. ה-ID אינו מוזן כי הוא identity.System::PackageID כ-nvarchar בגודל 1000 עם שם פרמטר 0, ואת System::EventHandlerStartTime כ-date עם שם פרמטר 1. Size לא רלוונטי לתאריכים. ספירת הפרמטרים מתחילה ב-0.OUTPUT inserted.ID, ומגדירים ב-Result Set מסוג Single row עם העמודה ID שנשמרת במשתנה user מסוג integer.WHERE ID = ?. הפרמטר הראשון הוא זמן האירוע והשני הוא המשתנה ששמר את ה-ID. כך מתעדכנת אותה שורה.הטקסט המלא של הדקות הראשונות בהרצאה «הסבר על SSIS Event Handlers» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
הדוגמה הבאה, אני אראה מקום נוסף איפה אנחנו יכולים לתעד לוגים של תהליך ההרצה שלנו, של תהליך ה-SSS. בדוגמה הקודמת ראינו כיצד בתוך ה-Control Flow אני יכול ללחוץ קליק ימני על מנת להגיע למסך של הלוגים.
בדוגמה הנוכחית, אני רוצה להכיר בפניכם את הטאב נוסף שמופיע לנו כאן במסך בשולחן העבודה. לאחר ה-Control Flow ו-Data Flow וקינפוק של הפרמטרים, יש לנו Event Handler.
Event Handler, כשמו כנאום, היכולת שלי לתפוס איבנטים ולנהל אותם, לבצע עליהם איזשהו תהליך מעבר לתיעוד של לוג כזה או אחר, כאן אני יכול כבר לייצר תהליך שלם מורכב יותר.
כיצד הדבר הזה נעשה? Once נכנסתי ל-Event Handler לתוך המסך, שוב פעם אני יכול לבחור את אותה יחידת קומפוננטה בתוך ה-Control Flow שאותה אני רוצה לתפוס את האירועים שלה, במקרה הזה תפסנו את Tranked and Load Data, כלומר את אותו סקווינס קונטיינר ובדרופ דאון השני באיבנט הנדלר אנחנו יכולים לבחור איזה
איבנט אנחנו רוצים להאזין לו. כל איבנט שאני אאזין לו אני אוכל לכתוב כאן תוכנית SSIS שלמה שתתעורר ותרוץ בעקרות אותו איבנט. כלומר ברגע שיש אירור אז אני יכול לכתוב כאן תוכנית שתבצע כל מה שאני ארצה לעשות. אולי במקרה הזה אני ארצה לשלוח מייל לאופרטור הנה התוכנית שלנו נכשלה.
אולי כשתהליך הסתיים או כשתהליך התחיל או סתם ברמה של אינפורמציה ברגע שהתהליך עצמו רץ. אנחנו נתפוס כאן שתי איבנטים pre-execute ותהליך עצמו של post-execute.
בתהליך של ה-pre-execute ו-post-execute אנחנו יכולים לכתוב כאן תוכנית שתרוץ ביקרות אותו אירוע. בואו נעשה זאת. אני רוצה שב-pre-execute וב-post-execute להריץ כאן פקודת sql אשר תלך לי לתוך קבלה בתוך הדאטאבייס ותתעד לי, תרשום לי היסטוריה של הרצות של אותו פקאג' ותציין את זמן ההתחלה ואת זמן הסיום.
איך נעשה זאת? את זמן ההתחלה אנחנו נעדכן באיבנט של ה-pre-execute, ואת זמן הסיום, בסיומו של אותו תהליך, של אותו פקאג' אנחנו נעדכן את השורה עצמה לזמן הסיום שלה.
בואו נעשה זאת. כדי לעשות זאת ניגש לתוך ה-SQL ונגדיר את הטבלה המתאימה. תחת הsql תחת הטבלה שאליה אנחנו כרגע מחוברים ניצור טבלה נוספת תחת הדאטאבס שאליו אנחנו מחוברים ניצור כרגע טבלה נוספת create table package log של הsas ובתוך הpackage log שלנו בתוך הטבלה עצמה אנחנו רוצים לשמור את התאריך ההתחלה אבל לפני זה אנחנו רוצים
איזשהו אינטג'ר איזושהי עמודת id שהיא תהיה מסוג אינטג'ר העמודה הזאת תהיה identity כלומר עמודה שהמערכת ממלאה לה את הערכים עצמם ואני לא צריך לדאוג על מנת ליצור זיהוי חד ערכי של כל שורה.
אנחנו נשמור כאן גם את ה-package ID ואנחנו גם נשמור את ה-start date ואת העמודה end date. בכוונה לא ציינתי מהו הדאטה טייפ שלהם מאחר ומדובר כאן בשלושה נתונים שלוש עמודות שאנחנו ניקח אותם מתוך משתנה סיסטם שקיימים בתוך ה-SSS.
כדי לדעת מה הערך שלהם ומה הדאטה טייפ שלהם, בואו נחזור לויז'ואל סטודיום וננסה לראות את אותם ערכים עצמם, את אותם פרמטרים שנמצאים שם. איך נראה את אותם ערכים עצמם, את אותם שדות?
כדי לראות אותם אני אביא לכאן הליך שנקרא Execute SQL Task, הרצה של פקודת SQL מול הדאטה בס. לפני שאנחנו מקנפגים אותם ולפני שאנחנו נכנסים לתהליך עצמו, אני רק רוצה להבין מהם השדות שיש לי.
אז אני רק משתמש בזה כדי להבין את אותם שדות. אני נכנס כאן לתוך פרמטר מפינג, לוחץ כאן על Add. טוב, הוא רוצה קודם כל שיהיה לנו כאן איזשהו קונקשן לתוך הדאטאבס, אז בואו נתחבר לתוך הדאטאבס שלנו, לתוך קונקשן סטרינק שיש לנו. ניכנס שוב פעם לפרמטר מפינג, ואני לוחץ כאן Add.
אני בכוונה מרווח את המקומות כדי שנוכל לראות אותם, וזה מה שאנחנו מגלים. כשאנחנו פותחים כאן משתנים אז ישנם משתנים שהמשתמש כפי שראינו יכול לייצר אותם בעצמו אבל לעומת זאת ישנם משתנים של הסיסטם נבדל בין משתנים ברמת הפרויקט שהמשתמש יכול ליצור אותם משתנים ברמת ה-user גם אותם המשתמש יכול לייצר אבל הם יותר ברמת ה-package הם
ב-low level הם לא תחת הפרויקט עצמו תחת כל ה-solution אלא הם ברמת ה-package טווח ההיכרות והחיים שלהם זה רק בתוך רמת הפקאג' עצמו, ויש לנו עוד משתנים נוספים, משתנים שהקידומת שלהם זה סיסטם, משתנים ששייכים למערכת.
מה יש לנו כאן? יש לנו cancel event, יש לנו קונטיינר סטארט-איים, מתי הקונטיינר עצמו התחיל לרוץ. או, זה פרמטר שמעניין אותנו. מהו זמן ההתחלה שלו?
מה ה-creation date? מתי נוצר אותו פקאג'? מה ה-creation name? מה ה-computer name שיצר אותם? באיזה מחשב הם נוצרו ומי יצר אותם, מי יצר אותם ה-creator name או כל אחד מהפרמטרים הללו שנמצאים כאן machine name, package ID, package name וכו'.
אלו הם הפרמטרים שאותם אנחנו רוצים לאסוף בתהליך עצמו של ה-pre ו-post execute. גם ב-pre וגם ב-post execute אנחנו נרצה להריץ פקודת SQL אשר תאסוף לי את הערכים הללו ותעדכן אותם בתוך הטבלה עצמה.
מה הדאטה טייפ שלהם של Package ID של אותו תאריך התחלה? בואו נפתח את הגוגל. הגוגל מראה לנו שישנם מספר System Variables שנמצאים בתוך ה-SSIS.
הוא מתאר לנו דסקריפשן קצר אודותם, מה המשמעות שלהם ומה ניתן לעשות בכל אחד מהם. אבל יתרה מכך, מה שחשוב לי כרגע זה לדעת מהו הדאטה טייפ שלהם.
אם אני גולה למטה ואני מסתכל על Package ID, אז Package ID הוא מסוג של סטרינג. זהו Unique Identifier של הפקאג', זהו מזהה חד ערכי של אותו פקאג', אבל הדאטה טייפ שנשלח הוא מסוג מחוזת.
לכן כשאנחנו נייצר את הטבלה, כאן כשאני נכנס לתוך ה-SQL, אז אני אבחר את העמודה של הפקאג' איי-די להיות varchar, אנחנו נבחר אותה כ-n varchar, unicode varchar, ואנחנו ניתן לה ריווח מספיק של 1000, מעל ומעבר.
אם נחזור לתוך הגוגל שלנו על מנת לחפש את העמודות הללו אז כאן אנחנו ניקח את הזמן ההתחלה של ה-container start time מתי הוא התחיל לרוץ יש לנו אפשרויות לקחת כאן זמנים נוספים הנה start time the time that the package started to run מתי הוא התחיל לרוץ זה זמן תחילת הריצה שלו.
לפעמים אנחנו רוצים את זמן תחילת כל הפקאג' ולפעמים אנחנו רוצים את הזמן ההתחלה רק של האיבנט עצמו שאותו אנחנו מאזינים לו. מאחר ובמקרה שלנו אנחנו לא רוצים את זמן ההתחלה של כל הפקאג' אנחנו רוצים לרדת drill down לרמת האיבנט עצמו אז אנחנו נתפוס את ה-container start time גם הוא הדאטה טייפ שלו זה time date ולכן אנחנו נגדיר
אצלנו בתוך הטבלה עצמה שאנחנו מדברים כאן על date time. ובכן בתהליך שלנו, ברגע שיתחיל התהליך עצמו אנחנו נכניס שורה מתאימה של ה-package ID וה-start time, קודם כל נמלא את השורה בצורה מתאימה ובסיומו של התהליך אנחנו נעדכן את ה-end date.
בואו ניצור את הטבלה, נתחבר לתוך הבסיס נתונים Northwind ושם ניצור את הטבלה, הרי שהטבלה נוצרה לנו בהצלחה. נחזור לתוך הוויז'ואל סטודיו.
בוויז'ואל סטודיו בתוך האירוע של ה-pre-execute אנחנו רוצים לתפוס את האיבן של תחילת ההרצה לפני ההרצה של אותו package שאליו אנחנו מאזינים ולתעד אותו בתוך המערכת. מה זה לתעד אותו? להכניס פקודת insert בתוך הדאטאבס. כדי לעשות זאת אז קודם כל אנחנו צריכים כאן קונקשן כדי להתחבר לתוך הדאטאבס ולאחר מכן אנחנו
צריכים לכתוב את הפקודת sql בעצמה. פקודה עצמה insert into נבחר לנו את שם הטבלה. הvalues שאותם אנחנו רוצים למלא בהתאמה הם יהיו לפי ה-ID, ה-ID אותו אנחנו לא ממלאים מאחר והוא אידנטיטי, אז אנחנו נמלא את ה-Package ID.
מאחר ואני לא ממלא את כל הערכים עצמם, אז אני חייב לציין בצורה מפורשת אילו שדות אני רוצה למלא. אז כאמור, אנחנו ממלאים את ה-Start Date ואת ה-End Date נמלא אותו בסוף.
ומבחינת ה-Values שאותם אנחנו רוצים להכניס, מהו ה-Package ומהו ה-Start Time, אלו הם פרמטרים שהתהליך עצמו יקבל, זה פרמטרים, אנחנו מסמנים על ידי סימן שאלה כפי שראינו בעבר, רושם סימן שאלה שכל אחד מסימני השאלה מייצג לי כאן בעצם פרמטר ובהתאמה זה יהיה הפרמטר הראשון והראשון מבחינתנו זה זה במקום האפס וזה הפרמטר השני הפרמטר במקום אחד.
כל אחד מהם מייצג בהתאמה הפרמטר הראשון זהו ה-package ID ואילו הפרמטר השני זהו הסטארט דייט שאנחנו רוצים להכניס. אז אני סוגר כאן את הפקודת sql ומאחר ויש לי כאן שני פרמטרים אני הולך להגדיר אותם.
בפרמטר מפינג שלנו אני אציין שהתהליך שלי מכיל שני פרמטרים. כיצד נעשה זאת? נלחץ על הכפתור add בתחתית המסך ונבחר מהו הפרמטר שאותו אנחנו רוצים לייצר.
אין לנו צורך לייצר כאן משתנה נוסף. מאחר ויש לנו כאן פרמטרים שיכולים לעזור לנו מתוך ה-System של ה-SSIS. אז יש כאן אירוע שהוא יכול מאוד לעניין אותנו מבחינת ההתחלה, Event Handler Start Time.
יש כאן לא אירוע אלא דאטה מאפיין Package ID שהוא יכול לעניין אותנו, מאחר והוא נותן לי את ה-ID שאותו אנחנו רוצים לטעון לטבלה. אז כפרמטר ראשון אני אבחר את ה-Package ID. זהו פרמטר לתוך פקודת SQL, אבל כרגע הוא מוגדר כ-variable, כמשתנה.
המשתנה עצמו, ראינו שהוא מסוג של ורקר, של מחרוזת. אז נציין כאן, by default, הוויז'ואל סטודיו בוחר לי את הלונג, אבל אנחנו רוצים כאן לומר לו שמדובר כאן על n ורקר.
מה הגודל שלו? את הגודל של n ורקר אנחנו חייבים לציין, ונכתוב כאן, אנחנו לוקחים כאן גודל, מספיק לנו גודל כזה. אז יש כאן מידע שהדאטה טייפ שלו יהיה n ורקר, אנחנו רוצים לקחת אותו כ-n varkar בגודל של 1000, ומבחינת הפרמטר name זה בעצם המיקום שלו בתוך
השאילתת sql. המיקום שלו, כפי שאמרנו, מתחיל מהמספור 0, ולכן אני מציין שהפרמטר הזה, המידע הזה, ייכנס לתוך הפרמטר מספר 0, לתוך הסימן שאלה הראשון שמופיע בשאילתה, ממש לפי הסדר.
נלחץ עוד הפעם על add, ובפרמטר השני אנחנו רוצים להגדיר, בשאילתת ה-insert שלנו, אנחנו רוצים להגדיר את התאריך ההתחלה. אז נבחר כאן את ה-Event Handler Start Time.
הדאטה טייפ שלו, נבחר את הדאטה טייפ המתאים, מדובר כאן על תאריך. אז נבחר כאן את ה-Date שלנו. זהו הפרמטר שלא נמצא במקום 0, אלא נמצא במקום 1, ובמקרה הזה אין לי צורך להגדיר מהו הפרמטר Size.
זהו מאפיין לא רלוונטי לשדות מסוג תאריך או שדות מסוג מספר או שדות מסוג מספרים עשרוניים, הוא רלוונטי רק לשדות מכרוזתיים, ולכן במקרה הזה אני משאיר אותו, כפי שהמערכת רשמה לי, כ-1.
הגדרנו כאן שני משתני סביבה שקיימים ברמת הסיסטם, ואותם אנחנו מייבאים אלינו לשאילתה כשני פרמטרים, 0 ו-1 בהתאמה.
שני הפרמטרים הללו, נחזור כאן לטאב של ג'נרל, ייכנסו בהתאמה לתוך הערכים values סימן שאלה פעמיים. נלחץ על אוקיי.
התהליך שלנו כרגע מקונפג. אני יכול להריץ עכשיו את כל התהליך עצמו. והאירוע event handler של ה-pre-execute ירוץ ויבצע את מה שצריך, אבל אני יכול גם להריץ אותו בצורה ידנית.
קליק ימני על הקומפוננטה עצמה ונבצע כאן Execute Task. שנייה לפני שאנחנו עושים זאת, בואו נתשאל את הטבלה שלנו, ונוודא שהטבלה שלנו אכן ריקה.
הטבלה שזה אחתה יצרנו, אז כמובן שהיא ריקה ואין בה נתונים עצמם. נחזור לתוך הוויז'ואל סטודיו ונריץ את התהליך, רק לוודא שאנחנו עושים נכון עד כאן.
בוא נראה. ובכן, התהליך הפשוט שלנו מריץ פקודת sql, בוא נראה שהוא הצליח להריץ אותה בהצלחה ולהוסיף לנו שורה בתוך הטבלה. כן, שורה נוספה לנו בתוך הטבלה.
ה-identity, המערכת נתנה אותו בצורה אוטומטית. Package ID זה המאפיין חד ערכי של אותו Package שאנחנו מריצים, וזה ה-Start Time שבו התחיל התהליך עצמו.
מה אנחנו אבל רוצים מתוך זה? אנחנו רוצים גם לתפוס את ה-Event של ה-Post Execute. כלומר, בתחילת התהליך להכניס שורה, אולם בסוף התהליך אנחנו רוצים לעדכן באותה שורה, לעדכן לה את ה-End Date.
כלומר, להיכנס לשורה המתאימה, השורה הרלוונטית, ולעדכן לה את הערך של end date. כיצד נעשה זאת? שוב פעם, גם כאן מדובר על פקודת sql.
נתחבר לתוך ה-connection string ונבצע כאן את פקודת sql. מה עושה כאן פקודת sql? היא לא צריכה להכניס שורה, אלא היא צריכה לעדכן שורה. למי היא מעדכנת שורה?
לטבלה שלנו. לאיזה עמודה היא מכניסה? לעמודת end date. מה היא תכניס? זהו פרמטר שהיא תקבל. אבל היא לא תעדכן את הערך הזה עבור כל השורות, אני אצטרך לפלטר דווקא את השורה המתאימה שאותה אני רוצה לעדכן.
מהי השורה המתאימה? כיצד נזהה את אותה שורה? על ידי ה-ID. כלומר, אני אצטרך לשלוח פרמטר נוסף שהוא יהיה ה-ID, שעבורו אנחנו רוצים לעדכן. אז גם כאן אני אשלח את זה כפרמטר נוסף, where ID שווה סימן שאלה.