(עוד) באג של SQL Sever - ‏ VIEW עם JOIN

urilei

New member
(עוד) באג של SQL Sever - ‏ VIEW עם JOIN

מי מכיר מי שמע? יש ב-SQL Server באג עקבי: ישנן שתי טבלאות: A ו-B (לצורך העניין יחיד לרבים ש-B זה הפירוט של A, אבל זה לא ממש משנה) יש VIEW, נאמר V שמכיל JOIN בינהם, נאמר משהו כזה
SELECT * FROM A LEFT JOIN B ON A.myID = B.myID​
הבעייה היא שכאשר מוסיפים שדה לטבלה A, כל הנתונים "זזים" שדה אחד ימינה מאיפה שהם צריכים להיות וכל ה-VIEW מתחרבש ונותן תוצאות שגויות בעליל. עם נכנסים להגדרה של ה-VIEW ומשנים משהו (אפילו מוסיפים רווח לבן בסוף או משהו), הכל מסתדר וה-VIEW ממשיך לרוץ כמו שצריך (עם השדה החדש) עכשיו, ברור לחלוטין שזה באג של SQL Server ולא שלי, השאלה היא אם יש דרכים להתמודד איתו. יש כמובן את האופציה של לא לעשות SELECT עם כוכבית אלא עם רשימת שדות ספציפיים וזה בגדול פותר את הבעייה, השאלה היא האם אפשר להגדיר לו "לקרוא" את ה-VIEW בלי שאני אצטרך להיכנס ולהוסיף רווח? תודה
 

Ice Age

New member
זה לא באג

בהגדרה אתה לא יכול לשמוט את הטבלה מתחת לרגליים של ה-View. אם אתה עושה with schema binding אז זה ימנע ממך לבצע דברים כאלה. אם לא - תדאג לקמפל מחדש את ה-view (שזה מה שאתה בעצם עושה כשאתה מוסיף רווח).
 

urilei

New member
מממ... אתה יכול קצת לפרט?

בזה שאתה אומר שזה לא באג - אני מבין מאיפה דבר כזה נוצר, אבל כשאני מנסה לקחת באפליקציה פלונית שדה בשם EventDate ומקבל מחרוזת במקום תאריך - כל הנימוקים הכי יפים בעולם לא ישנו את העובדה שזה באג. בכל אופן, אתה יכול קצת להרחיב על ה-with schema binding, מה זה, איפה מגדירים את זה, ומה המשמעות של זה? האם יש דרך להגיד ל-VIEW "להתקמפל" בכל פעם שמשנים את הטבלאות עליהן הוא מבוסס או משהו כזה? תודה!
 

גרי רשף

New member
בצע Refresh View

הרץ את הפקודה sp_refreshview MyView הבעייה מוכרת וקורית כשמשתמשים ב-* Select ומשנים את מבנה הטבלה. יותר טוב שלא אספר לך אילו נזקים אני גרמתי בגלל הבעייה הזו..
 

Ice Age

New member
תשובות

עקרונית זה לא "חוקי" לשנות את הטבלה שה-view מתבסס עליה. אבל אפשרו לעשות את זה כדי לא להציק יותר מדי וגם כי יש הרבה מקרים שזה לא באמת משנה וה-view ימשיך לעבוד. אני מבין מה שאתה אומר, לכאורה היו צריכים לתת התראה או משהו במקרה שה-view הופך ללא תקין בעקבות שינוי, אבל לא עשו את זה. מה שאתה יכול לעשות זה להשתמש ב-SchemaBinding שלא יאפשר שינוי טבלה ש-view מסתמך עליה. תוכל לקרוא על זה ב-BOL תחת Create VIEW.
 
למעלה