content top
כיצד קורה שניתן ליצור פרוצדורה בסכימה אך לא להריץ אותה

כיצד קורה שניתן ליצור פרוצדורה בסכימה אך לא להריץ אותה

 

1. הקדמה:

בsql server- ניתן ליצור פרוצדורה. לעומת זאת כשבאים לבצע אותה, מקבלים הודעה בדבר הרשאה להריץ אותה. לכאורה – נשמע לא תקין – כאילו באג בפועל זה לא כך.

2. תשובה לבעייה:

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

3. הפעלת דוגמא:

3.1. יצירת בסיס נתונים TestDB(הנחה שהוא לא קיים)

Use master

Go

Create database TestDB

Go

3.2. יצירת login בשם TestUser

Create login TestUser with password = 'SomePassword'

Go

3.3. יצירת ,תפקיד – role בשם Object_Creator-מורשה ליצירת אובייקטים והוספת הרשאות אליו ליצירה ולשינוי אובייקטים בסכימה dbo.

Create role Object_Creator

Go

Grant ALTER on SCHEMA::dbo to Object_Creator

Grant CREATE on SCHEMA::dbo to Object_Creator

3.4. יצירת משתמש – TestUser בשם והצמדתו לתפקיד-role Object_Creator

Create user(TestUser)

Go

3.5. הצמדת ה- Object_Creator role למשתמש שיצרנו

Exec sp_addrolemember @membername='TestUser',@rolename='Object_Creator

Go

3.6. יצירת הפרוצדורה תחת המשתמש החדש שיצרנו:

Use TestDB

Go


Execute as login = 'TestUser'

Go


If exists(select name from sys.procedures where name = 'TestProc')

Drop proc dbo.TestProc

Go


Create proc dbo.TestProc

As

Begin

Select 'abcd'

End

Go

במקרה זה לתפקיד-role יש את היכולת ליצור/לשנות פרוצדורות בסכימה dbo ששייכת לdatabase owner. היות והוא לא מחזיק אותה , אין לו גישה לאובייקטים בסכימה כמו ביצוע selectוכמובן- לא לבצע את הפרוצדורה.

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

3.7. אבל כשמנסים להריץ את הפרוצדורה תחת TestUser

Revert

Go


Execute as login='TestUser '

Go


Exec dbo.TestProc

Go

מקבלים כמו שציפינו הודעה בדבר הרשאות:

image

אותה הודעה נקבל אם נבצע login עם TestUser ומנסים להפעיל את הפרוצדורה.

3.8. מה שנעשה עכשיו זה להסיר את הrole Object_Creator מהמשתמש שהגדרנו ולהצמיד לו role אחר db_owner:

Revert

Go


Exec sp_droprolemember @membername='TestUser', @rolename='Object_Creator'

Go


Exec sp_addrolemember @membername='TestUser', @rolename='db_owner'

Go

3.9. נריץ שוב את הפרוצדורה והיא תעבוד בצורה תקינה.

הסיבה: קישרנו אותו לrole עם הרשאות הרצה על הסכימה dbo

Execute as login='TestUser '

Go


Exec dbo.TestProc

Go

.image

4. הערה:

בדוגמאות הנ"ל יש שימוש רב בפונקציה revert. מה עושה פונקציה זאת?

כברירת מחדל ה-session מתחילה כשמשתמש מבצע log on ומסתיימת כשהוא מבצע logoff.

כל הפעולות המבוצעות בזמן הsession כפופות להרשאות של המשתמש. כאשר מבצעים: execute as, התוכן של הריצה-execution context מתחלף ל-login הספציפי או למשתמש המצוין ואז ההרשאות נבדקות כנגד משתמש זה ולא כנגד המשתמש שהפעיל את הפקודה: . execute as. בעיקרו של דבר, מבוצעת אימפרסונציה של המשתמש כל עוד ה-session בפעולה. עד שמבוצעת פעולת revert שמחזירה את ה-execution context למשתמש המקורי.

בדוגמא שלנו הפרוצדורה הורצה תחת , TestUser אבל כדי להגדיר role למשתמש מבצעים revert וחוזרים למשתמש המקורי, כדי לעבוד עם ההרשאות הדרושות לביצוע פעולות אלו.

בדוגמא הבאה, אנו עובדים תחת משתמש dbo. אם נכתוב: select USER_NAME() נקבל כתוצאה dbo. אם נשנה את המשתמש ע"י הפעלת הפונקציה: Execute as login = 'TestUser'

וביצוע select USER_NAME() נקבל כפלט את המשתמש TestUser. הפעלת הפונקציה Revert תגרום לכך שיוצג שוב dbo , כשנדגום שוב את שם המשתמש.

Select USER_NAME()

Execute as login = 'TestUser'

Select USER_NAME()

Revert

Select USER_NAME()

Go

image


כתיבת תגובה

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

5 × five =