כיצד נדע אילו ג'ובים רצים או האם ג'וב מסויים רץ כרגע?
בדרך כלל ניגש ב-SSMS לסעיף Jobs (ב-SQL Server Agent) ונגיע להיסטוריה על ידי קליק ימני על הסעיף או על הג'וב הספציפי:
הבעייה היא שכך נגיע לרשימת הג'ובים שרצו והסתיימו, אך לא לאלו שרצים כרגע.
במקרה הטוב, אם לג'וב יש מספר צעדים (Steps) נוכל לראות את אלו שרצו וללמוד מכך על מה שרץ כרגע,
אך מה עם ג'ובים שיש להם רק צעד אחד או שהם עדיין בצעד הראשון?
האובייקטים השונים המטפלים בג'ובים, ההגדרות שלהם, ההיסטוריה, ההרשאות וכו'- נמצאים בדטבייס msdb; אולם בטבלאות נמצא את המידע המוצג ויזואלית ב-SSMS ולא את מה שאנחנו מחפשים.
המידע המבוקש נמצא בפרוצדורות מערכת בדטבייס הנ"ל- sp_help_job או sp_help_jobactivity שנעזרות בפרוצדורות Extended, ועם קצת יצרתיות נוכל להפוך אותן לשליפת Select שניתן לתחקר על ידי מיון / סינון / פילטור, ולבצע Join עם אובייקטים נוספים כדי להגיע לכל המידע הדרוש.
בשלב ראשון יש לבצע באופן חד פעמי הרשאה להרצת Ad Hoc Distributed Queries:
SP_Configure 'Ad Hoc Distributed Queries',1;
Go
Reconfigure With Override;
Go
וכעת לשליפה עצמה:
Select HJ.name JobName,
HJ.description JobDescription,
JS.step_name StepName,
JS.database_name [DB_Name],
Cast(JS.command As XML) SQL,
HJ.current_retry_attempt RetryAttempt,
HJA.Start_execution_date StartJob,
IsNull(HJA.last_executed_step_date,HJA.Start_execution_date) StartJobStep
From OpenRowSet('SQLNCLI','Server=(Local);Trusted_Connection=Yes','Set FmtOnly Off Exec msdb.dbo.sp_help_job') HJ
Inner Join OpenRowSet('SQLNCLI','Server=(Local);Trusted_Connection=Yes','Set FmtOnly Off Exec msdb.dbo.sp_help_jobactivity') HJA
On HJ.job_id=HJA.job_id
Inner Join msdb.dbo.sysjobsteps JS
On HJ.job_id=JS.job_id
And HJ.current_execution_step Like '%('+JS.step_name+')%'
Where HJ.current_execution_status=1
And HJA.start_execution_date Is Not Null
And HJA.stop_execution_date Is Null;
עם המזל שלנו- אף ג'וב לא רץ כרגע, ואיך נוכל לדעת שזה באמת עובד?
ניצור בזריזות ג'וב בשם TryJob, ובו שני צעדים (Step1, Step2) שמופיעה בהם הפקודה:
WaitFor Delay '00:01'
(זו פעולת סרק שרצה במשך דקה ומסתיימת בהצלחה)
ונשמור אותו.
נפעיל את הג'וב (לא חייבים לתזמן אותו לשם כך):
Exec msdb..sp_start_job 'TryJob';
Go
וישר אחר כך את השליפה הנ"ל:
כעבור כדקה נריץ שוב וכעת נראה ש-Step2 רץ.
זו גרסה ראשונה ומינימלית, ובהמשך ארחיב אותה כך שתכלול מידע נוסף.
מי שרוצה- מוזמן לעשות זאת בעצמו.