יישום טיפול בשגיאות T-SQL
שגיאה מציינת בעיה או בעיה שיש לציין שמקורה במהלך פעולת מסד נתונים. ניתן ליצור שגיאות על-ידי מנגנון מסד הנתונים של SQL Server בתגובה לאירוע או לכשל ברמת המערכת; לחלופין, באפשרותך ליצור שגיאות יישום Transact-SQL שלך.
רכיבים של שגיאות במנגנון מסד הנתונים
לא משנה מה הסיבה, כל שגיאה מורכבת מהרכיבים הבאים:
- מספר שגיאה - מספר ייחודי המזהה את השגיאה הספציפית.
- הודעת שגיאה - טקסט המתאר את השגיאה.
- חומרה - אינדיקציה מספרית לחומרה מ- 1 עד 25.
- State - קוד מצב פנימי עבור המצב של מנגנון מסד הנתונים.
- Procedure - שם הפרוצדורה המאוחסנת או הגורם המפעיל שבו אירעה השגיאה.
- מספר שורה - המשפט באצוות או בהליך שיצר את השגיאה.
שגיאות מערכת
שגיאות מערכת מוגדרות מראש, ובאפשרותך להציג אותן בתצוגת המערכת sys.messages . כאשר מתרחשת שגיאת מערכת, SQL Server עשוי לבצע פעולת תיקון אוטומטית, בהתאם לחומרת השגיאה. לדוגמה, כאשר מתרחשת שגיאת חומרה גבוהה, SQL Server עשוי לקחת מסד נתונים למצב לא מקוון או אפילו להפסיק את שירות מנגנון מסד הנתונים.
שגיאות מותאמות אישית
באפשרותך ליצור שגיאות ב- Transact-SQL כדי להגיב לתנאים ספציפיים ליישום או כדי להתאים אישית מידע שנשלח ליישומי לקוח בתגובה לשגיאות מערכת. ניתן להגדיר שגיאות יישום אלה בתוך השורה שבה הן נוצרות, או להגדיר אותן מראש בטבלת sys.messages לצד השגיאות שסופקו על-ידי המערכת. מספרי השגיאה המשמשים עבור שגיאות מותאמות אישית חייבים להיות 50001 ומעלה.
כדי להוסיף הודעת שגיאה מותאמת אישית ל- sys.messages, השתמש sp_addmessage. המשתמש עבור ההודעה חייב להיות חבר בתפקידי השרת הקבוע sysadmin או serveradmin.
זהו התחביר sp_addmessage הבא:
sp_addmessage [ @msgnum= ] msg_id , [ @severity= ] severity , [ @msgtext= ] 'msg'
[ , [ @lang= ] 'language' ]
[ , [ @with_log= ] { 'TRUE' | 'FALSE' } ]
[ , [ @replace= ] 'replace' ]
להלן דוגמה להודעת שגיאה מותאמת אישית באמצעות תחביר זה:
sp_addmessage 50001, 10, N’Unexpected value entered’;
בנוסף, באפשרותך להגדיר הודעות שגיאה מותאמות אישית, החברים בתפקיד שרת sysadmin יכולים גם להשתמש בפרמטר נוסף, @with_log. כאשר השגיאה מוגדרת כ- TRUE, תתועד גם ביומן היישומים של Windows. כל הודעה שנכתבה ביומן היישומים של Windows נכתבת גם ביומן השגיאות של SQL Server. היה זהיר בשימוש באפשרות מאחר @with_log שמנהלי מערכת ורשתות נוטים לא לתאם אפליקציות "צ'אט" ביומני הרישום של המערכת. עם זאת, אם השגיאה צריכה להיות לכודה על-ידי התראה, יש לכתוב תחילה את השגיאה ביומן היישומים של Windows.
הערה
העלאת שגיאות מערכת אינה נתמכת.
ניתן להחליף הודעות מבלי למחוק אותן תחילה באמצעות @replace האפשרות = 'replace'.
ההודעות ניתנות להתאמה אישית וניתן להוסיף אותן עבור אותו מספר שגיאה עבור שפות מרובות, בהתבסס על language_id חדש.
הערה
הודעות באנגלית הן language_id 1033.
העלאת שגיאות באמצעות הפונקציה RAISERROR
ניתן להשתמש הן ב- PRINT והן ב- RAISERROR כדי להחזיר מידע או להציג הודעות אזהרה ליישומים. הפונקציה RAISERROR מאפשרת לאפליקציות להעלות שגיאה שתהליך השיחות יכול להיתפס בה.
הצהרת RAISERROR
היכולת להעלות שגיאות ב- T-SQL מקלה על הטיפול בשגיאות ביישום, מכיוון שהיא נשלחת כמו כל שגיאת מערכת אחרת. הפונקציה RAISERROR משמשת ל:
- עזרה בפתרון קוד T-SQL.
- בדוק את ערכי הנתונים.
- החזר הודעות המכילות טקסט משתנה.
הערה
השימוש במשפט PRINT דומה להגדלת שגיאה בחומרה 10.
להלן דוגמה להודעת שגיאה מותאמת אישית המשתמשת ב- RAISERROR.
RAISERROR (N'%s %d', -- Message text,
10, -- Severity,
1, -- State,
N'Custom error message number',
2)
כאשר מופעל, הוא מחזיר:
Custom error message number 2
בדוגמה הקודמת, %d מציין מיקום עבור מספר %sהוא מציין מיקום עבור מחרוזת. בנוסף, עליך לשים לב שלא הוזכר מספר הודעה. כאשר שגיאות במחרוזות הודעה מופעלות באמצעות תחביר זה, יש תמיד את מספר השגיאה 50000.
העלאת שגיאות באמצעות THROW
המשפט THROW מציע שיטה פשוטה יותר להגדלת שגיאות בקוד. שגיאות חייבות לכלול מספר שגיאה של 50000 לפחות.
השליך
הפונקציה THROW שונה מ- RAISERROR במספר דרכים:
- שגיאות המועלה על-ידי THROW הן תמיד חומרה 16.
- ההודעות שהוחזרו על-ידי THROW אינן קשורות לערכים כלשהם ב- sys.sysmessages.
- שגיאות שהופעלו על-ידי THROW גורם לביטול טרנזקציה רק בעת שימוש בשילוב עם SET XACT_ABORT ON וההפעלה מסתיימת.
THROW 50001, 'An Error Occured',0
לכידת קודי שגיאה באמצעות @@Error
רוב הקוד המסורתי לטיפול בשגיאות ביישומי SQL Server נוצר באמצעות @@ERROR. טיפול בחריגים מובנים הוצג ב- SQL Server 2005 ומספק חלופה חזקה לשימוש @@ERROR. זה יידון בשיעור הבא. כמות גדולה של קוד קיים לטיפול בשגיאות של SQL Server מבוססת על @@ERROR, ולכן חשוב להבין כיצד לעבוד איתו.
@@ERROR
@@ERROR הוא משתנה מערכת המכיל את מספר השגיאה של השגיאה האחרונה שאירעה. אתגר משמעותי אחד @@ERROR הוא שהערך שהוא מחזיק מתאפס במהירות כאשר כל הצהרה נוספת מבוצעת.
לדוגמה, שקול את הקוד הבא:
RAISERROR(N'Message', 16, 1);
IF @@ERROR <> 0
PRINT 'Error=' + CAST(@@ERROR AS VARCHAR(8));
GO
ייתכן שתצפה לכך, כאשר הקוד מבוצע, הוא יחזיר את מספר השגיאה במחרוזת מודפסת. עם זאת, כאשר הקוד מבוצע, הוא מחזיר:
Msg 50000, Level 16, State 1, Line 1
Message
Error=0
השגיאה הועלתה אך ההודעה הודפסה היתה "שגיאה=0". בשורה הראשונה של הפלט, ניתן לראות שהשגיאה, כצפוי, היתה למעשה 50000, עם הודעה שהועברה ל- RAISERROR. זאת משום ש משפט IF המופיע אחרי המשפט RAISERROR בוצע בהצלחה וגרמה לאיפוס @@ERROR ערך ה- IF. מסיבה זו, בעת עבודה עם @@ERROR, חשוב ללכוד את מספר השגיאה למשתנה ברגע שהוא מועלה, ולאחר מכן להמשיך לעבד עם המשתנה.
הבט בקוד הבא שמדגים זאת:
DECLARE @ErrorValue int;
RAISERROR(N'Message', 16, 1);
SET @ErrorValue = @@ERROR;
IF @ErrorValue <> 0
PRINT 'Error=' + CAST(@ErrorValue AS VARCHAR(8));
כאשר קוד זה מבוצע, הוא מחזיר את הפלט הבא:
Msg 50000, Level 16, State 1, Line 2
Message
Error=50000
מספר השגיאה מדווח כראוי כעת.
טיפול בשגיאות ברכזות
בעיה משמעותית אחרת בשימוש @@ERROR לטיפול בשגיאות היא שקשה לרכז את קוד ה- T-SQL. טיפול בשגיאות נוטה להסתיים בפיזור לאורך הקוד. ניתן לרכז את הטיפול בשגיאות @@ERROR במידה מסוימת, באמצעות תוויות במשפטי GOTO. עם זאת, רוב המפתחים של היום יזעיפי את זה כשיטות קידוד גרועות.
יצירת התראות שגיאה
עבור קטגוריות מסוימות של שגיאות, מנהלי מערכת עשויים ליצור התראות של SQL Server מאחר שהם מעוניינים לקבל הודעה ברגע שהן מתרחשות. הדבר יכול גם לחול על הודעות שגיאה המוגדרות על-ידי המשתמש. לדוגמה, ייתכן שתרצה להעלות התראה בכל פעם ש יומן טרנזקציות מתמלא. התראה משמשת בדרך כלל להזנת שגיאות ברמת חומרה גבוהה (כגון חומרה 19 ומעלה) לתשומת לבם של מנהלי מערכת.
העלאת התראות
ניתן ליצור התראות עבור הודעות שגיאה ספציפיות. שירות ההתראות פועל על-ידי רישום עצמו כשירות התקשרות חזרה בשירות רישום האירועים. משמעות הדבר היא שהתראות פועלות רק על שגיאות נרשם.
קיימות שתי דרכים לגרום לשגיאה להעלות התראה - באפשרותך להשתמש באפשרות WITH LOG בעת העלאת השגיאה או שניתן לשנות את ההודעה כדי לרשום אותה על-ידי ביצוע sp_altermessage. האפשרות WITH LOG משפיעה רק על המשפט הנוכחי. השימוש sp_altermessage משנה את אופן הפעולה של השגיאה עבור כל השימוש העתידי. שינוי שגיאות מערכת באמצעות sp_altermessage אפשרי רק מ- SQL Server 2005 SP3 או מ- SQL Server 2008 SP1 ואילך.