הרשאות – או לא להיות- איך ניתן לקבל הרשאות דרך Role בעת שימוש בקוד PL/SQL - ilDBA Portal

הרשאות – או לא להיות- איך ניתן לקבל הרשאות דרך Role בעת שימוש בקוד PL/SQL

26/12/2011 | פורסם על ידי

שלום,

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

SQL>  CREATE OR REPLACE PROCEDURE create_table IS
2     BEGIN
3           EXECUTE IMMEDIATE 'CREATE TABLE TEMP (col1 NUMBER)';
4           DBMS_OUTPUT.PUT_LINE('Table Created.');
5     END;
6     /
Procedure created.

SQL>  EXEC create_table
BEGIN create_Table; END;
*
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "HR.CREATE_TABLE", line 3
ORA-06512: at line 1

שימו לב שהמשתמש קיבל הודעת שגיאה שאינו רשאי ליצור טבלה וזאת למרות שיש לו את ההרשאה הנדרשת לעשות זאת. הסיבה לכך טמונה בעובדה שבזמן הרצת קוד PL/SQL, אורקל אינו בודק את ההרשאות אשר ניתנו למשתמש באמצעות ROLE. לפיכך, ניתן לפתור את הבעיה פשוט ע"י מתן ההרשאה הספציפית ליצור טבלה ישירות בעזרת פקודת GRANT ולא דרך ה- ROLE. אולם מה לגבי המקרים שבהם אין באפשרותנו לתת הרשאות ישירות ? האם יש באפשרותנו לאלץ את אורקל לבצע בדיקה של ההרשאות אשר ניתנו דרך ה- ROLE ? שימו לב לדוגמא שלהלן:

SQL>  CREATE OR REPLACE PROCEDURE create_table
2     AUTHID CURRENT_USER
3     IS
4     BEGIN
5           EXECUTE IMMEDIATE 'CREATE TABLE TEMP (col1 NUMBER)';
6           DBMS_OUTPUT.PUT_LINE('Table Created.');
7     END;
8     /
SQL>  EXEC create_table
Table Created.
PL/SQL procedure successfully completed.

השינוי הינו בהוספת הפקודה AUTHID CURRENT_USER (שורה 2 לעיל). הפקודה הנ"ל מאלצת את אורקל לבדוק את ההרשאות אשר ניתנו דרך ה- ROLE ולכן הפרוצדורה מסתיימת ללא שגיאות והטבלה החדשה נוצרת בהצלחה. להלן ההסבר הרשמי מתוך הדוקומנטציה של אורקל:

The use of roles in a subprogram depends on whether it executes with definer's rights or invoker's rights. Within a definer's rights subprogram, all roles are disabled. Roles are not used for privilege checking, and you cannot set roles. Within an invoker's rights subprogram, roles are enabled. Roles are used for privilege checking, and you can use native dynamic SQL to set roles for the session.

http://www.filibeto.org/sun/lib/nonsun/oracle/10.1.0.2/B14117_01/appdev.101/b10807/08_subs.htm#i18574

בהצלחה !

נתראה ברשומה הבאה!

עמי אהרונוביץ

ניתן ליצור קשר עם עמי דרך עמוד האודות שלו: אודות

תגובה אחת ל- “הרשאות – או לא להיות- איך ניתן לקבל הרשאות דרך Role בעת שימוש בקוד PL/SQL”

commenter

מאמר יפה.
חשוב להדגיש שכאשר אתה יוצר אותו עם INVOKER RIGHT – גם אם תתן ליוזר אחר הרשאות להריץ את הפרוצדורה , אתה תהיה חייב לתת לו הרשאות גם על הטבלה עצמה, כי INVOKER אומר שהוא רץ עם ההרשאות של היוזר המריץ , בניגוד ל-DEFAULT שהוא DEFINER – שאומר שהפרוצדורה רצה עם ההרשאות של היוזר שבו היא מוגדרת.

השאר תגובה:

שם (חובה):
אימייל (לא יפורסם) (חובה):
תגובה (חובה):

*



מאמרים קשורים

הפונקציה COALESCE

כולם מכירים את הפונקציה NVL, ומשתמשים בה לא מעט. לעומת זאת, הפונקציה COALESCE, השייכת לאותה משפחה של פונקציות, פחות מוכרת, למרות שהיא קיימת כבר מגרסה 9i ועולה ביכולותיה על NVL הישנה והטובה. מצד שני, אף [...]

טיפ: איך לזכור ב-SQLPLUS שאתה בסביבת היצור

כמה פעמים קרה לנו שעבדנו עם sqlplus  מול סביבת יצור ביחד עם עוד כמה חלונות פתוחים ועם קצת לחץ? בקיצור כרגיל… מכוון שהכול כל כך לחוץ, הרצנו איזה פקודה הרסנית, ומיד הצטערנו עליה מאוד: אוי! הרצתי [...]
עבודה

עבודה תחת סביבת FireWall

אורי לרנר בטיפ קצר ושימושי על עבודה בסביבת אורקל [...]
Indexes

Indexes in SQL Server 2

ערן שקד ממשיך בסדרת מאמרים על אינדקסים בSQL [...]
Copyright 2019 ilDBA Portal. Brought to you by Brillix - Israel Leading DBA company. Sponsored by: DBSnaps - Database Video Tutorialss
Website Security Test
%d בלוגרים אהבו את זה: