اهدای مجوز در سطح اسکیما در اوراکل و پستگرس

در مطلب قبلی سعی کردیم تفاوتهای schema و user را در دیتابیس پستگرس و اوراکل تشریح کنیم. در این مطلب به اهدای مجوز در سطح اسکیما در این دو دیتابیس خواهیم پرداخت.

در دیتابیس پستگرس می توان به راحتی و با اجرای یک دستور مجوز دسترسی به تمامی جداول موجود در یک اسکیما را به کاربران اهدا کرد.مثال زیر را ببینید.

postgres=# \c postgres vahid

postgres=> select current_user;

 vahid

postgres=> select * from myschema.tbl1;

ERROR:  permission denied for schema myschema

خطای فوق عدم دسترسی کاربر vahid به جدول myschema.tbl1 را نشان می دهد. برای برطرف کردن این خطا، از طریق کاربر postgres که superuser هم هست به دیتابیس متصل شده و دستور زیر را اجرا می کنیم:

postgres=> \c postgres postgres

postgres=# grant usage on schema myschema to vahid;

GRANT

postgres=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschema TO vahid;

GRANT

با اهدای این مجوز، کاربر vahid به همه جداول موجود در اسکیمای myschema دسترسی کامل دارد:

postgres=#  \c postgres vahid

postgres=> select * from myschema.tbl1;

 id | name

—-+——-

  1 | test1

  2 | test2

  3 | test3

(3 rows)

این نحوه مجوزدهی می تواند برای دیگر objectهای دیتابیس نظیر function و sequence هم تکرار شود:

postgres=# GRANT ALL ON ALL FUNCTIONS IN SCHEMA public,myschema TO vahid ;

GRANT

postgres=# GRANT ALL ON ALL SEQUENCES IN SCHEMA myschema TO vahid ;

GRANT

usefdb=# GRANT ALL ON SCHEMA public TO vahid ;

GRANT

برخلاف دیتابیس پستگرس که به راحتی می توان دسترسی به همه objectهای یک schema را به یک کاربر اهدا کرد، در اوراکل مسئله کمی متفاوت است. در این دیتابیس مجوز معادلی برای schema level grant وجود ندارد و بنابرین DBA باید این مسئله را باید به روش دیگری هندل کند.

 برای مثال DBA می تواند این کار را از طریق نوشتن  بلاکی مشابه با بلاک pl/sqlای زیر انجام دهد:

begin
FOR i IN (SELECT * FROM dba_tables WHERE owner = ‘USEF’)
LOOP
EXECUTE IMMEDIATE ‘GRANT ALL ON ‘ || i.owner || ‘.’ || i.table_name || ‘ TO vahid’;
END LOOP;
end;

/

البته این بلاک صرفا دسترسی جداول جاری یک schema را به کاربر اهدا خواهد کرد و اگر جدول جدیدی در اسکیما ایجاد شود، کاربر به آن دسترسی نخواهد داشت.

به عنوان یک راهکار در این زمینه می توان از تریگر استفاده کرد:

create or replace trigger grant_all_new_table
after CREATE on schema
declare
l_str varchar2(255);
l_job number;
begin
if ( ora_dict_obj_type = ‘TABLE’ )
then
l_str := ‘execute immediate “grant all on ‘ ||ora_dict_obj_name ||’ to vahid”;’;
dbms_job.submit( l_job, replace(l_str,'”‘,””) );
end if;
end;
/

مثال:

SQL> create table usef.TEST_NEW_TABLE as select * from v$datafile;
Table created

SQL> select count(*) from user_tab_privs f where grantee=’VAHID’ and table_name=’TEST_NEW_TABLE’;
COUNT(*)
———-
12

 

ارتباط با نویسنده مطلب:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@

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

نشانی ایمیل شما منتشر نخواهد شد.