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

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

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 را با حداقل دسترسی ایجاد کرده و بررسی می کنیم که آیا این کاربر می تواند تابع فوق را اجرا کند؟

SQL> create user vahid  identified by a;
User created.
SQL> grant create session to vahid; 
Grant succeeded.

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

SQL> grant execute on sys.tabe to vahid;
Grant succeeded.

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

SQL> conn vahid/a 
Connected.
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 موضوعیت ندارد).

SQL> create role r1;
Role created.
SQL> grant select on dba_segments to r1;
Grant succeeded.
SQL> grant r1 to function sys.Tabe;
Grant succeeded.
SQL> conn vahid/a 
Connected.
SQL> select sys.tabe('SYS','JADVAL1') from dual;
SYS.TABE('SYS','JADVAL1')
--------------------------
46137344

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

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)

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

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