content top
תזמון משימות ב-SQL Azure בעזרת Azure Function

תזמון משימות ב-SQL Azure בעזרת Azure Function

(תודה מראש לפיני קרישר על העזרה והמידע המועיל)

אחת הבעיות המעט משעשעות שהיו ל-Azure בתחילת דרכו הייתה שלא ניתן היה להשתמש בו ללא שרת On Premise שאיפשר את כל מה ש-Azure לא.

 

למשל: כיצד עובדים מול Azure? הרי לא מדובר בהתקנה שכוללת כלי Client כמו ה-SSMS.. צריך היה איזו התקנה – זמנית או מוזלת או לא חוקית כדי שיהיה ממשק עבודה. נכון שהפורטל הישן איפשר פעם הרצה של פקודות SQL, אך האפשרות הזו נוטרלה משיקולים השמורים למיקרוסופט, וכל מה שנשאר אלו אתרים בלתי תלויים (למשל- SkyVia). ההגינות מחייבת לציין שה-SSMS הוא בחינם כיום ולכן אין בעייה להוריד ולהתקין, אבל אני מנסה לכוון לתסריט בו אני עובד ממחשב ציבורי או מ”עמדת אינטרנט” שכל מה שיש לה אלו היכולות המינימליות להתחבר לאינטרנט, בערך כשם שאני יכול לנהל את האימיילים שלי כיום ללא כל התקנה מקומית של אאוטלוק.
אתמול עודכנתי שנוספה אופצייה מתאימה ל-Azure, נכון לרגע זה – עדיין ב-Preview:

image

נקווה שהפינה הזו נסגרה..
בעייה נוספת הייתה תזמון המשימות: כיצד עושים זאת בהעדר Agent? אפשר כמובן להיעזר ב-Agent של מערכת On Premise תוך שימוש ב-Linked Server ל-Azure, או להיעזר ב-Scheduler של ה-Windows באחד השרתים; אך מה הועילו חכמים בתקנתם?
מסתבר שיש פתרון, טיפה מסורבל אבל עובד: Azure Function. מדובר באופצייה ב-Azure שמאפשרת הרצה של קוד #C או Java Scipt כולל תזמון; וניתן איפוא להפעיל בעזרתה פרוצדורות ב-SQL Azure.
המצרכים:

  • חשבון Azure (כאילו דה?)
  • פרוצדורה בדטבייס שאותה נרצה להפעיל
  • מצב רוח טוב
  • הפוסט הזה

נתחיל ב-New & Function App:

image

נבחר ב-Function App:

image

ניצור:

image

בוחרים שם וממלאים את כל הרובריקות (מה האפשרויות וכיצד יוצרים חדשות – לא במסגרת הפוסט הזה):

image

לוקח כדקה עד שזה נוצר.

כעת חוזרים לתפריט הראשי בצד שמאל, ודרך App Services מגיעים ל-Function App שזה עתה יצרנו:

image

נכנסים לשם ומגיעים לכאן:

image

באופן חד פעמי נתחיל מה-Function App Settings (למטה משמאל) כדי לשמור את ה-Connection String לדטבייס ב-SQL Azure:

בוחרים ב-Go to App Service Settings:

image

דרך Application Settings מגיעים ל-Connection Strings למטה, מכניסים את ה-Connection String, נותנים לו שם מתאים, ושומרים:

image

ה-Connection String אמור להיראות בערך כך (לשנות את שם השרת, שם הדטבייס, שם המשתמש, והסיסמה):

Server=myservername.database.windows.net;Initial Catalog=mydbname;Persist Security Info=False;User ID=MyUser;Password=my5ecretpa$$w0rd;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=0;

חוזרים שמאלה למסך ממנו פנינו ל-Function App Settings, בוחרים ב-New Function, באחת מאפשרויות ה-#C (לא משנה איזו כי הקוד יובא להלן), ונותנים שם מתאים;
וב-Schedule נבחר להריץ כל לילה ב-3 לפנות בוקר (לאפשרויות נוספות):

image

במסך העריכה שנפתח מכניסים את הקוד שבהמשך:

image

#r "System.Configuration"

#r "System.Data"

using System.Configuration;

using System.Data.SqlClient;

using System.Threading.Tasks;


public static async Task Run(TimerInfo myTimer, TraceWriter log)

  {

      var str = ConfigurationManager.ConnectionStrings["MyCon"].ConnectionString;

      using (SqlConnection conn = new SqlConnection(str))

      {

          conn.Open();

          var text = "Exec  dbo.P_Test 5;";

          using (SqlCommand cmd = new SqlCommand(text, conn))

          {

              // Execute the command and log the # rows deleted.

              cmd.CommandTimeout=0;

              var rows = await cmd.ExecuteNonQueryAsync();

              log.Info($"{rows} rows were ");

          }

      }

  }

יש לשמור, ניתן להריץ ידנית (Save and Run) או לחכות בסבלנות ל-3 בבוקר..


כתיבת תגובה

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

3 × 3 =