הבלוג של גרי רשף

23/12/2010

טרנזקציות ופעולות DDL

Filed under: Uncategorized — תגיות: , , , , — גרי רשף @ 15:14

טרנזקציות מקושרות בתודעתנו לפעולות DML (שינויים בנתוני הטבלאות): אם בתוך הטרנזקציה הוספנו, שינינו, מחקנו וכו', ולבסוף ביצענו Rollback – כל השינויים מתבטלים ואנחנו חוזרים לנקודת ההתחלה.

ב-SQL Sever הטרנזקציות משפיעות גם על פעולות DDL (שינויים במבני טבלאות): יצירת אובייקטים, ביטול אובייקטים ושינוי אובייקטים. כך למשל פעולת -Truncate Table שהיא בעצם יצירה מחדש של הטבלה – המתבצעת בתוך טרנזקציה, תתבטל במקרה של Rollback.

הייתה לי היום תזכורת מעט משעשעת (בדיעבד) לכך- אני כותב פרוצדורה מורכבת הכוללת שימוש בטבלאות זמניות בעזרת SQL דינאמי, ומכיוון שטבלאות זמניות פרטיות (בעלות #סולמית בודדת) נמחקות בסיום הפרוצדורה – במהלך הפיתוח אני משתמש בפרוצדורות זמניות ציבוריות (בעלות ##סולמית כפולה) שאוכל לתחקר לאחר סיום הריצה.

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

לקח לי זמן להבין שהפרוצדורה מתחילה ב-Begin Tran, במקרה של שגיאה מופעל מנגנון ה-Catch, ומתבצע Rollback;

וכתוצאה מכך הפקודה הבאה –

If Object_Id('tempdb..##MyTbl') Is Not Null Drop Table ##MyTbl;


Exec('Select    …,

            …,

         

    Into    ##MyTbl

    From    …')

התבטלה והטבלה הישנה הוחזרה למערכת..

רק כדי להעמיד דברים על דיוקם: העובדה שמדובר בטבלה זמנית ציבורית ולא בזמנית פרטית או בקבועה- אינה משנה מבחינת השפעת הטרנזקציה, למעט העובדה שטבלה זמנית פרטית נעלמת בסוף הפרוצדורה, וטבלה קבועה לא מקובל ליצור במהלך הרצת פרוצדורה.

בנוסף- העובדה שמדובר ב-SQL דינאמי היא עקרונית, מכיוון שאחרת- הפרוצדורה לא הייתה מתקמפלת בגלל אי התאמת פקודות ה-SQL למבנה הטבלה.

מודעות פרסומת

להגיב »

עדיין אין תגובות.

RSS feed for comments on this post. TrackBack URI

כתיבת תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

יצירה של אתר חינמי או בלוג ב־WordPress.com.

%d בלוגרים אהבו את זה: