Execute As & With Execute As
האופרטור Execute As מאפשר לבצע פעולות תחת זהות אחרת מזו שלנו, ללא צורך להתחבר בזהות אחרת,
למשל- כדי לבצע בדיקות שהקוד שנכתב על ידי המפתח שיש לא הרשאות יחסית גבוהות יעבוד גם כשיופעל על ידי משתמש שהרשאותיו נמוכות,
או לחילופין- להגדיר שקוד מסויים ירוץ בזהות גבוהה מזו של המשתמש.
כמובן שבעל הרשאות נמוכות לא יכול להשתמש ב-Execute As כדי לאמץ לעצמו זהות של System Administartor..
דוגמה- ניצור Login חדש במערכת ו-User המשוייך לו:
Use tempdb;
Go
Create Login MyLogin With Password='1234',Check_Policy=Off;
Go
Create User MyUser For Login MyLogin;
Go
כעת ניצור פרוצדורה פשוטה ששולפת את פרטי המשתמש שמריץ אותה ונעניק ל-User הנ"ל הרשאה להריץ אותה:
Create Proc MyProc1 As
Select sUser_name() [sUser_name()],
User_name() [User_name()];
Go
Grant Execute On MyProc1 To MyUser;
Go
כעת נריץ אותה תוך שאנחנו מזדהים כ-MyUser, ומבטלים לאחר מכן את ההזדהות באמצעות Revert:
Execute As User='MyUser';
Go
Exec MyProc1;
Go
Revert;
Go

כפי שאפשר לראות- המערכת זיהתה את מי שמריץ את הפרוצדורה בתור MyLogin & MyUser הנ"ל ולא בתור האדמיניסטראטור (אני), וזו דרך טובה לבדוק אם יש למשתמשים הרשאות מתאימות כדי שלא נקבל הודעות שגיאה לאחר העלייה לאוויר.
אם אריץ אותה בזהותי האמיתית (ללא שימוש ב-Execute As) היא תזהה אותי כצפוי:

כעת נבצע פעולה הפוכה- ניצור פרוצדורה שבתוכה יופיע האופרטור Execute As כך שמי שמריץ יזוהה בתור ה-Owner שלה, גם אם אינו אלא משתמש פשוט, וניתן הרשאות הרצה ל-MyUser (לא לטעות- המשתמש החדש עדיין זקוק להרשאות הרצה):
Create Proc MyProc2 With Execute As Owner As
Select sUser_name() [sUser_name()],
User_name() [User_name()];
Go
Grant Execute On MyProc2 To MyUser;
Go
כעת אריץ אותה תחת הזהות של MyUser, כפי שהרצתי את הפרוצדורה הראשונה בהתחלה:
Execute As User='MyUser';
Go
Exec MyProc2;
Go
Revert;
Go

אפשר להבין מכך שבלי לתת ל-MyUser הרשאות מפורשות, כל מה שהפרוצדורה תבצע יהיה תחת הזהות של ה-Admin.