اهدای مجوز به فانکشن، پکیج و پروسیجر

زمانی که یک program unit(فانکشن، پکیج، پروسیجر) به صورت invoker right ایجاد می شود، کاربر صدا زننده برنامه، با مجوز خودش این برنامه را اجرا خواهد کرد بنابرین اگر جدولی در برنامه موجود باشد که این کاربر به آن دسترسی نداشته باشد، کارش با خطا متوقف خواهد شد(بررسی Invoker’s Rights و Definer’s Rights). برای مثال، تابع زیر را در نظر بگیرید:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> CREATE FUNCTION sys.Tabe(name_malek in varchar2,name_jadval in varchar2)
RETURN VARCHAR2
AUTHID CURRENT_USER
AS
V_bytes varchar2(1000);
BEGIN
select bytes into V_bytes from dba_segments where owner=name_malek and segment_name=name_jadval;
RETURN V_bytes;
END;
/
Function created.
SQL> CREATE FUNCTION sys.Tabe(name_malek in varchar2,name_jadval in varchar2) RETURN VARCHAR2 AUTHID CURRENT_USER AS V_bytes varchar2(1000); BEGIN select bytes into V_bytes from dba_segments where owner=name_malek and segment_name=name_jadval; RETURN V_bytes; END; / Function created.
SQL> CREATE FUNCTION sys.Tabe(name_malek in varchar2,name_jadval in varchar2)
   RETURN VARCHAR2
   AUTHID CURRENT_USER
AS
V_bytes varchar2(1000);
BEGIN
  select bytes into V_bytes from dba_segments where owner=name_malek and segment_name=name_jadval;
   RETURN V_bytes;
END;
/
Function created.

این تابع که با یوزر sys ایجاد شده، قرار است نام segment را دریافت و حجم آن را بر اساس بایت برگرداند. عبارت AUTHID CURRENT_USER بیانگر invoker right است.

کاربری با نام vahid را با حداقل دسترسی ایجاد کرده و بررسی می کنیم که آیا این کاربر می تواند تابع فوق را اجرا کند؟

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> create user vahid identified by a;
User created.
SQL> create user vahid identified by a; User created.
SQL> create user vahid  identified by a;
User created.
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> grant create session to vahid;
Grant succeeded.
SQL> grant create session to vahid; Grant succeeded.
SQL> grant create session to vahid; 
Grant succeeded.

بدیهی است که اگر کاربری بخواهد تابع کاربر دیگر را اجرا کند، باید مجوز اجرای آن تابع را داشته باشد:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> grant execute on sys.tabe to vahid;
Grant succeeded.
SQL> grant execute on sys.tabe to vahid; Grant succeeded.
SQL> grant execute on sys.tabe to vahid;
Grant succeeded.

با این شرایط، آیا کاربر vahid می تواند تابع sys.tabe را اجرا کند؟

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> conn vahid/a
Connected.
SQL> conn vahid/a Connected.
SQL> conn vahid/a 
Connected.
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> select sys.tabe('SYS','JADVAL1') from dual;
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at "SYS.TABE", line 7
SQL> select sys.tabe('SYS','JADVAL1') from dual; ERROR at line 1: ORA-00942: table or view does not exist ORA-06512: at "SYS.TABE", line 7
SQL> select sys.tabe('SYS','JADVAL1') from dual;
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at "SYS.TABE", line 7

همانطور که می بینید، کاربر vahid با توجه به آنکه به ویوی dba_segments دسترسی ندارد، امکان اجرای این تابع را هم نخواهد داشت. راهکار مناسب چیست؟

تا قبل از اوراکل نسخه 12c، به ناچار می بایست مجوز دسترسی به ویو را به صورت مستقیم به کاربر اهدا کرد تا کاربر بتواند این تابع را اجرا کند اما اوراکل در نسخه 12c، قابلیت اهدای مجوز به program unit را ارائه کرد که بر اساس آن، اگر دسترسی به ویو را به تابعی اهدا کنیم، کاربرانی که به ان ویو دسترسی مستقیم ندارند، می توانند ان تابع را صدا اجرا کنند(البته این مسئله در توابع Definer’s Right موضوعیت ندارد).

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> create role r1;
Role created.
SQL> create role r1; Role created.
SQL> create role r1;
Role created.
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> grant select on dba_segments to r1;
Grant succeeded.
SQL> grant select on dba_segments to r1; Grant succeeded.
SQL> grant select on dba_segments to r1;
Grant succeeded.
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> grant r1 to function sys.Tabe;
Grant succeeded.
SQL> grant r1 to function sys.Tabe; Grant succeeded.
SQL> grant r1 to function sys.Tabe;
Grant succeeded.
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> conn vahid/a
Connected.
SQL> conn vahid/a Connected.
SQL> conn vahid/a 
Connected.
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> select sys.tabe('SYS','JADVAL1') from dual;
SYS.TABE('SYS','JADVAL1')
--------------------------
46137344
SQL> select sys.tabe('SYS','JADVAL1') from dual; SYS.TABE('SYS','JADVAL1') -------------------------- 46137344
SQL> select sys.tabe('SYS','JADVAL1') from dual;
SYS.TABE('SYS','JADVAL1')
--------------------------
46137344

اهدای مجوز صرفا باید از طریق role انجام شود:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> grant select on usef.tabe to function sys.Tabe;
ORA-28700: Only roles can be attached to or detached from program units.
SQL> grant select on usef.tabe to function sys.Tabe; ORA-28700: Only roles can be attached to or detached from program units.
SQL> grant select on usef.tabe to function sys.Tabe;
ORA-28700: Only roles can be attached to or detached from program units.

 

ارائه خدمات مشاوره ، پشتیبانی و نصب و راه اندازی پایگاه داده اوراکل در سراسر کشور...................... تلفن: 09128110897 ایمیل:vahidusefzadeh@gmail.com

Comment (1)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *