content top
כיצד ניתן להפעיל ג'וב עם פרמטרים?

כיצד ניתן להפעיל ג'וב עם פרמטרים?

לא ניתן!
(יכולתי לסיים כאן ולזכות בתואר הפוסט הכי קצר באתר, או הפוסט היחיד שהכותרת שלו ארוכה מהתוכן וכו')

לא סתם אי אפשר, אלא אין בזה הגיון: ג'וב מפעילים באופן עקיף בעזרת ה-Scheduler שקובע מתי הוא ירוץ, או באופן ישיר בעזרת פרוצדורת המערכת SP_Start_Job.
במקרה הראשון (הפעלה מתוזמנת), מה בדיוק ההגיון בשימוש בפרמטרים? אם הוא יתוזמן ויופעל פעם אחת– הפרמטרים יכולים להיות חלק ממנו, ואם הוא יתוזמן ויופעל דרך קבע – מה בדיוק הרעיון ומהיכן הצורך בפרמטרים?
במקרה השני (הפעלה יזומה)– יש לשאול קודם כל למה ג'וב ולא פרוצדורה, הרי רוצים שהוא יתחיל לרוץ עכשיו. אם התשובה המנומקת היא שרוצים שהקוד ירוץ באופן אסינכרוני ומנותק מהעמדה שלנו – הכלי הנכון לעשות זאת הוא Service Broker ולו מפני שהוא גם פותר את בעיית הפרמטרים וגם ניתן להפעיל אותו במקביל מספר פעמים (בניגוד לג'וב!). יחד עם זאת- אם מישהו עובד עם גרסה קודמת ל-2005 או מסיבות אלו ואחרות אין זמן וחשק ללמוד לעשות זאת עם Service Broker, ובנוסף לכל – הוא צריך משהו גנרי שניתן יהיה להריץ אותו בעוד מקרים (ולכן לא ניתן לשים את הפרמטרים בתוך הג'וב) – אזי ניתן להיעזר בטבלה יעודית שבה יהיו הפרמטרים ושהג'וב יפנה אליה.
כלומר- באותו מקרה קצה שמכוונים לנו אקדח לרקה ומתעקשים שנריץ ג'וב עם פרמטרים מבחוץ, נוכל להעביר אותם אליו באמצעות טבלה. זו התשובה הישירה לשאלה שבכותרת, אבל חוץ מזה – זה מיותר לחלוטין.

דוגמאות:
1. יש לי ג'וב שרץ כל לילה, הוא צריך לבצע גיבוי של הלוג, ובסוף השבוע לבצע גיבוי מלא, ואני רוצה להעביר לו פרמטר לגבי סוג הגיבוי הנדרש בכל פעם.
תשובה- איך בדיוק תעביר? הרי הוא רץ כל לילה באופן אוטומטי.. הלוגיקה הזו צריכה להיות בתוך הג'וב שלפי היום בשבוע יקבע איזה גיבוי לבצע, או ליצור שני ג'ובים – אחד לימי חול, ואחד לשבת קודש.

2. יש לי ג'וב שמשתמשים שונים רוצים להפעיל אותו, כל אחד עם פרמטר אחר.
תשובה- בשביל זה יש Service Broker, ודרכו ניתן להפעיל פרוצדורה באופן אסינכרוני (או להיעזר בטבלת פרמטרים למרות שזה פתרון עקום).

3. יש לי פרוצדורה שאני רוצה שתרוץ מחר לפנות בוקר כשאין עומס על השרת כמו עכשיו, ויש להפעיל אותה עם מספר פרמטרים.
תשובה- בג'וב כתוב פקודת Execute לפרוצדורה עם כל הפרמטרים Hard coded. למה להעביר אותם לג'וב? שיהיו בפנים!

4. אני רוצה שהפרוצדורה מסעיף 3 תרוץ כל יום ולא רק מחר, בכל פעם עם פרמטרים אחרים. מה אז?
תשובה- זה בדיוק כמו בסעיף 1: אם הפרמטר קשור ליום או לחודש או לשעה בהם הג'וב רץ – הלוגיקה צריכה להיות בתוכו, ובהתאם ליום/חודש/שעה הג'וב "יחליט" איך להריץ. מנגד, אם הכוונה שהיום הג'וב ירוץ עם הפרמטר X ומחר עם Y וכך הלאה – אזי הפירוט הזה חייב להיות כתוב באיזה מקום: או בטבלה ממנה יהיה ניתן לקרוא מה הפרמטר בכל פעם, או שיהיה כתוב בתוך הג'וב; ובכל מקרה אי אפשר "להגיד" ל-scheduler אם איזה פרמטר להריץ בכל פעם (וגם אם היתה אופציה כזו – מה ההבדל בין לפרט אותה ב-scheduler או בג'וב או בטבלה?).

לסיכום: אם מישהו בא ושואל איך להפעיל ג'וב עם פרמטרים, צריך לברר למה ומה בדיוק הוא צריך, ולהראות לו איך ניתן לעשות את זה ללא פרמטרים; לא במובן של "בוא נאלתר משהו במקום" אלא כי הרעיון של העברת הפרמטרים לג'וב הוא עצמו אילתור ושימוש לא נכון בג'וב.
כנראה שמי ששואל את זה מעוניין ליזום הפעלה אסינכרונית באופן מזדמן (ולא קבוע שניתן לתזמן מראש), ובמקרה זה הפתרון כאמור הוא Servicr Broker.

(לא הפוסט הכי קצר אבל לפחות אין בו קודים הפעם..)


3 תגובות על “כיצד ניתן להפעיל ג'וב עם פרמטרים?”

  1. טוב, תרשה לי לא להסכים.
    חוץ ממקרים שהזכרת ורצון להפעיל משהו אסינכרוני.
    אני נתקל במקרה שאני צריך לתת אופציה למשתמשים להפעיל משהו עם הרשאות גבוהות ועם פרמטרים.
    שוב – אני לא כיר דרך פשוטה לעשות זאת עם service broker.
    וכמובן יש מקרים רבים נוספים…

  2. מאת גרי רשף:

    יבגני- אתה יכול לפרט כדי שנדע לפחות על מה אנחנו לא מסכימים?

    איך המשתמשים מפעילים את הג'וב – בעזרת SP_StartJob או על ידי תזמון? למה? (כלומר- למה הם מפעילים כך)
    למה יש צורך בפרמטרים במקרה זה?

    ה-Service Broker הוא לא הכי עקרוני. אם כל הסיפור הוא הפעלה אסינכרונית עם פרמטרים – אני יכול להבין אותך..

  3. פינגבאק: jordans for cheap

כתיבת תגובה

האימייל לא יוצג באתר. (*) שדות חובה מסומנים

20 + 9 =