none
האם ישנה דרך לבדוק תקינות של פרוצדורה מבלי להריץ אותה RRS feed

  • שאלה

  • שלום רב אני רוצה לבצע מספר שינויים בטבלאות בבסיס הנתונים .

    ואני רוצה לדעת איזו פרוצדורה אלו כל אובייקט אחר  עלול לפול בעקבות השנויים .

    משהו כמו compile 

    יום שני 06 יוני 2011 07:19

תשובות

  •  היי,

    זאת הדרך שלי לבחון תקינות של פרצדורה:

    1) הרצה של  כל פקודה בניפרד אחת אחרי  ולראות אם יש נפילה.

    2) אם אתה חושש  שתעשה נזק למרות שאתה אמור לבדוק בטסטים תקינות של הפרצדורה  :)  אז תעשה begin tran לפני כל הרצה של פקודה ותחליט לפי התוצאות אם אתה רוצה לעשות commit או  rollback.

    3)  השתמש במנגנון try catch  כדי לתפוס נפילות ( תוכל להשתמש ב rollback  ב section  של ה catch)

    4) בסוף  תעטוף את הכל בפצדורה ותיקרא לה.

    בהצלחה.

    שרון

     

     

    • הוצע כתשובה על-ידי DanMaxic יום רביעי 08 יוני 2011 20:23
    • סומן כתשובה על-ידי Meir Pinto יום רביעי 22 יוני 2011 11:20
    יום שני 06 יוני 2011 07:30
  • הי,

    אתה יכול להשתמש ב-

    SET

    PARSEONLY

    ON

    או

    SET

    FMTONLY ON

    ויש גם אופציית

    SET NOEXEC ON

    צירפתי דוגמאות לשתי האופציות הראשונות

    Create table dbo.t11(cola int)
    Go
    
    Create Procedure dbo.usp_parse_no_errors
    As
    Select * from dbo.t1
    
    Go
    
    Create Procedure dbo.usp_parse_error
    As
    Select * from dbo.t4
    Go
    
    
    SET PARSEONLY ON
    
    Exec dbo.usp_parse_no_errors
    Exec dbo.usp_parse_error
    
    SET PARSEONLY OFF

    דוגמא ל- SET FMTONLY

     

    Create table dbo.t1(cola int)
    Go
    
    Create Procedure dbo.usp_valid_sp
    As
    Select * from dbo.t1
    
    Go
    
    Create Procedure dbo.usp_with_error_sp
    As
    Select * from dbo.t4
    Go
    
    
    SET FMTONLY ON
    
    Exec dbo.usp_valid_sp
    Exec dbo.usp_with_error_sp
    
    SET FMTONLY OFF

    אסף שלם
    • הוצע כתשובה על-ידי DanMaxic יום רביעי 08 יוני 2011 20:23
    • סומן כתשובה על-ידי Meir Pinto יום רביעי 22 יוני 2011 11:19
    יום שני 06 יוני 2011 09:11
  • הי עופר,

    בגרסא הבא יש פתרון הרבה יותר מוצלח.

    http://www.sqlmag.com/blogs/puzzled-by-t-sql/entryid/76283/denali-t-sql-at-a-glance-metadata-discovery

    בהצלחה


    אסף שלם
    • סומן כתשובה על-ידי Meir Pinto יום רביעי 22 יוני 2011 11:20
    יום שני 06 יוני 2011 09:36

כל התגובות

  •  היי,

    זאת הדרך שלי לבחון תקינות של פרצדורה:

    1) הרצה של  כל פקודה בניפרד אחת אחרי  ולראות אם יש נפילה.

    2) אם אתה חושש  שתעשה נזק למרות שאתה אמור לבדוק בטסטים תקינות של הפרצדורה  :)  אז תעשה begin tran לפני כל הרצה של פקודה ותחליט לפי התוצאות אם אתה רוצה לעשות commit או  rollback.

    3)  השתמש במנגנון try catch  כדי לתפוס נפילות ( תוכל להשתמש ב rollback  ב section  של ה catch)

    4) בסוף  תעטוף את הכל בפצדורה ותיקרא לה.

    בהצלחה.

    שרון

     

     

    • הוצע כתשובה על-ידי DanMaxic יום רביעי 08 יוני 2011 20:23
    • סומן כתשובה על-ידי Meir Pinto יום רביעי 22 יוני 2011 11:20
    יום שני 06 יוני 2011 07:30
  • הי,

    אתה יכול להשתמש ב-

    SET

    PARSEONLY

    ON

    או

    SET

    FMTONLY ON

    ויש גם אופציית

    SET NOEXEC ON

    צירפתי דוגמאות לשתי האופציות הראשונות

    Create table dbo.t11(cola int)
    Go
    
    Create Procedure dbo.usp_parse_no_errors
    As
    Select * from dbo.t1
    
    Go
    
    Create Procedure dbo.usp_parse_error
    As
    Select * from dbo.t4
    Go
    
    
    SET PARSEONLY ON
    
    Exec dbo.usp_parse_no_errors
    Exec dbo.usp_parse_error
    
    SET PARSEONLY OFF

    דוגמא ל- SET FMTONLY

     

    Create table dbo.t1(cola int)
    Go
    
    Create Procedure dbo.usp_valid_sp
    As
    Select * from dbo.t1
    
    Go
    
    Create Procedure dbo.usp_with_error_sp
    As
    Select * from dbo.t4
    Go
    
    
    SET FMTONLY ON
    
    Exec dbo.usp_valid_sp
    Exec dbo.usp_with_error_sp
    
    SET FMTONLY OFF

    אסף שלם
    • הוצע כתשובה על-ידי DanMaxic יום רביעי 08 יוני 2011 20:23
    • סומן כתשובה על-ידי Meir Pinto יום רביעי 22 יוני 2011 11:19
    יום שני 06 יוני 2011 09:11
  • הי עופר,

    בגרסא הבא יש פתרון הרבה יותר מוצלח.

    http://www.sqlmag.com/blogs/puzzled-by-t-sql/entryid/76283/denali-t-sql-at-a-glance-metadata-discovery

    בהצלחה


    אסף שלם
    • סומן כתשובה על-ידי Meir Pinto יום רביעי 22 יוני 2011 11:20
    יום שני 06 יוני 2011 09:36
  • תמיד נחמד ללמוד דברים חדשים אסף :-)
    לא הכרתי אף אחת מ 2 הוראות אלו

    תוספת הבהרה: התכוונתי להוראות:
    PARSEONLY
    FMTONLY

     

    • נערך על-ידי pituachMVP, Editor יום ראשון 12 יוני 2011 06:17 תוספת הבהרה
    שבת 11 יוני 2011 20:16
    מנחה דיון
  • אם אתה רוצה למצוא אובייקטים שקוראים\משתמשים בטבלאות שאתה משנה - אתה יכול לבצע חיפוש לפי השם שלהם ב-DB:

    http://copypastenet.blogspot.com/#uds-search-results


    itaigitt, http://copypastenet.blogspot.com
    יום ראשון 12 יוני 2011 05:57
  • היי אסף.

    תוכל לפרט קצת יותר על 2 האופציות האלו?

    לגבי - SET FMTONLY - מה זה metadata בהקשר הזה?

    לגבי SET PARSEONLY - נסיתי את הדוגמא שלך, ובשני ההרצות קבלתי הודעת שגיאה לגבי t4....

    תודה!


    itaigitt, http://copypastenet.blogspot.com
    יום ראשון 12 יוני 2011 08:19
  • הי,

    בשמחה, קצת לחוץ כרגע אז זה יהיה לקראת ערב. 

    יום טוב,


    אסף שלם
    יום ראשון 12 יוני 2011 09:53
  • הסבר קצר:

    SET FMTONLY

    http://msdn.microsoft.com/en-us/library/ms173839.aspx
    Returns only metadata to the client. Can be used to test the format of the response without actually running the query.

    מטאדטא זה כאילו מידע על המידע או במלים אחרות הם מאפייני מידע של אפליקציה
    למשל בדוט נט עבודה עם מטא דטא נעשה באמצעות REFLECTION.

    דוגמה מעשית: בקוד רושמים את המטאדטא מעל בלוק הקוד עליו הוא מגדיר את המידע. מידע זה יכול להיות מידע כגון מי כתב את הקוד או מידע יותר מובנה כגון למי יש הרשאות גישה לקטע הקוד. למשל הנה קטע קוד קטן ב MVC:

     

    [Authorize]
    [
    HttpPost]
    public
     ActionResult ChangePassword(ChangePasswordModel model){

    כאן יגיע הקוד של הפרוצדורה

        }

    2 השורות הראשונות בקוד הם מטאדטה (OFF: אחד קובע שכניסה לקטע קוד זה יהיה רק בהגעת POST ואחד קובע שרק משתמשים מורשים יכולים להיכנס)

    אם נחזור ל SQL הרי שמטא טדא יכולים להיות למשל שמות עמודות בטבלה או כל מידע של האפליקציה (מידע לעומת דטא).

    SET FMTONLY ON;

    יגרור שהשאילתה בכלל לא רצה מבחינת להחזיר דטא אבל אבל כל המטאדטא (המידע על האפליקציה) שהיא אמורה להחזיר כן יוחזרו. למשל בשאילתת בחירה פשוטה בדרך כלל מקבלים את תוצאת השאילתה + נתונים  כגון שמות השדות ועוד נתונים נסתרים לפעמים. הנתונים של הדטא לא יוחזרו אבל שמות השדות כן יחזרו (בגישה מרחוק למשל דרך אפליקציה הנגשת למסד נתונים זה יאפשר המשך הרצת האפליקציה ולכן זו שיטה נהדרת לדיבאג)

     



    יום ראשון 12 יוני 2011 11:54
    מנחה דיון
  • מה אומר מטאדטא על טבלה "רגילה" ב-DB, שעליה אני אעשה SELECT ...FROM ואם SET FMTONLY ON אני לא אקבל תוצאות?
    itaigitt, http://copypastenet.blogspot.com
    יום ראשון 12 יוני 2011 12:03
  • הי איתי,

    באופן כללי אין לזה הרבה שימוש בהרצה מה- Managment Studio מכוון שמה שחוזר מהשאילתא זה רשימת השדות של ה- resultset, ה- data type שלהם, אורך מחרוזות וכו' ....

    השימוש יעיל כאשר מריצים מהקוד, ה- Recordset\ datareader מקבל את ה- Metadata ויכול לבצע ולידציה לפני הרצת הפרוצדורה ו- binding.

    סוג של pre validation לסוג הנתונים שיחזרו מהרצת השאילתא.

    כאמור ב- Managment studio אתה תקבל רק את רשימת השדות שתחזיר השאילתא מבלי להריץ אותה בפועל.

    אני מקווה שזה מספיק ברור 

     


    אסף שלם
    יום ראשון 12 יוני 2011 12:19
  • קצת סידר את הדברים, אבל אין איזושהי הגדרה קולעת ל-METADATA ברמת ה-DB? לא ממש הצלחתי למצוא....

    ומה לגבי SET PARSEONLY?

    תודה, איתי.


    itaigitt, http://copypastenet.blogspot.com
    יום ראשון 12 יוני 2011 12:47
  • הי איתי,

    מה שמוגדר זה בערך מה שחוזר מהשאילתא המצורפת.

    יש גם לינק, לא קראתי אותו לעומק אבל נראה אינטילגנטי :)

    http://msdn.microsoft.com/en-us/magazine/cc164065.aspx

    לגבי PARSEONLY מתבצעת רק ולידציה של הקוד, parsing, כלומר בדיקת סינטקס של כל משפט t-sql ללא קומפילציה או הרצה של הפרוצדורה/ שאילתא.

    Select * from INFORMATION_SCHEMA.COLUMNS


    ערב טוב,


    אסף שלם
    יום ראשון 12 יוני 2011 14:03
  • היי,

    אשמח אם תוכל/י לעדכן אותנו בסטטוס השאלה שלך.

     

    במידה וקיבלת תשובה מתאימה לשאלתך, יש לסמן את התשובה המתאימה ע"י לחיצה על "סמן כתשובה" ליד סימון ה V הירוק

    אם לא קיבלת תשובה, מומלץ לספק פרטים נוספים אודות הבעיה, פרטי לוג, צילומי מסך וכו'

    על מנת להעלות תמונה לפורום ניתן להעזר במדריך להעלאת תמונה.


    אם תגובתי פתרה את בעייתך - לחץ/י, על "סמן כתשובה" ליד סימן ה V הירוק.

    על מנת להעלות תמונה לפורום ניתן להעזר במדריך להעלאת תמונה
    מיקרוסופט מציעה שירות זה ללא תשלום, למטרת סיוע למשתמשים והעשרת הידע הקשור בטכנולוגיות ובמוצרים של Microsoft. תוכן זה מתפרסם כפי שהוא והוא אינו מעיד על כל אחריות מצד מיקרוסופט.
    יום שלישי 21 יוני 2011 13:10