האם פרוצדורה יכולה להתאבד?

07/02/2014

תגיות: , ,
אין תגובות

כנראה שמשעמם לי בחיים אם הגעתי לנושא הרה גורל זה: האם פרוצדורה יכולה לבצע Drop לעצמה?
בואו ננסה:

Use tempdb;

Go

 

Create Proc P As

Print 'Before:';

Print @@ProcID;

Print Object_Name(@@ProcID);

Drop Proc P;

Print 'After:';

Print @@ProcID;

Print Object_Name(@@ProcID);

Go

היא אמורה לכתוב את הקוד והשם שלה לפני ההתאבדות ואחריו.
נריץ:

Exec P;

clip_image002

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

Create Proc P As

Print 1;

Exec('Alter Proc P As Print 2;');

Exec P;

Go

נריץ:

Exec P;

clip_image004

כלומר- הפרוצדורה לא נכנסה ללולאה אינסופית בה היא מדפיסה 1 ומפעילה את עצמה שוב ושוב,
אלא הפעילה את הפרוצדורה המתוקנת בה היא מדפיסה 2 ומסיימת ללא רקורסיה.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *