Рассмотрим новые для 12c системные привелегии "inherit [any] privileges".
Для проверки нам понадобится небольшая заготовка:
Так как по-умолчанию привилегия "inherit privileges" выдана PUBLIC'у, мы ее отберем:
Согласно документации, системная привелегия "inherit [any] privileges" контроллирует набор привелегий доступных процедурам/функциям
запускаемым с правами вызывающего пользователя(authid current_user).
Пользователь test2 в нашем случае, обладает более узким набором прав в бзе данных и он будет создавать у себя различные объекты,
предоставляя доступ к ним для пользователя test1.
Итак, в процедуре мы пытаемся внести записи в таблицу пользователя test1, процедура объявлена как исполняющаяся с правами вызывающего пользователя,
inherit privileges для test1 мы отняли.
Теперь вызовем эту процедуру из-под пользователя test1:
Но если бы мы не отняли inherit privileges для test1 у PUBLIC'а или выдали бы inherit any privileges пользователю test2, то ошибки бы не было.
Дадим test2 привилегию наследовать права от test1:
Эта привилегия также будет актуальна при создании представлений с использованием функций использующих права вызываемого пользователя:
Представление test2.testview1 ожидаемо не будет работать, будучи объявленным как bequeath definer,
функция, вызываемая в приложении будет выдавать ошибку, т.к. прав на test1.testtab у пользователя test2 нет:
Проверим как это работает под пользователем test1 для представления объявленного как bequeath current_user:
Для проверки нам понадобится небольшая заготовка:
create user test1 identified by test default tablespace users; grant create session to test1; grant create table to test1; alter user test1 quota 100M on users; create table test1.testtab(c0 number not null); create user test2 identified by test default tablespace users; grant create session to test2; grant create procedure to test2; grant create view to test2; |
Так как по-умолчанию привилегия "inherit privileges" выдана PUBLIC'у, мы ее отберем:
revoke inherit privileges on user test1 from public; |
Согласно документации, системная привелегия "inherit [any] privileges" контроллирует набор привелегий доступных процедурам/функциям
запускаемым с правами вызывающего пользователя(authid current_user).
Пользователь test2 в нашем случае, обладает более узким набором прав в бзе данных и он будет создавать у себя различные объекты,
предоставляя доступ к ним для пользователя test1.
create or replace procedure test2.testproc authid current_user as begin for i in 1..100 loop execute immediate 'insert into test1.testtab(c0) values('||round(dbms_random.value(0,100))||')'; end loop; commit; end; / grant execute on test2.testproc to test1; |
Итак, в процедуре мы пытаемся внести записи в таблицу пользователя test1, процедура объявлена как исполняющаяся с правами вызывающего пользователя,
inherit privileges для test1 мы отняли.
Теперь вызовем эту процедуру из-под пользователя test1:
SQL> exec test2.testproc; BEGIN test2.testproc; END; * ERROR at line 1: ORA-06598: insufficient INHERIT PRIVILEGES privilege ORA-06512: at "TEST2.TESTPROC", line 1 ORA-06512: at line 1 |
Но если бы мы не отняли inherit privileges для test1 у PUBLIC'а или выдали бы inherit any privileges пользователю test2, то ошибки бы не было.
Дадим test2 привилегию наследовать права от test1:
SQL> grant inherit privileges on user test1 to test2; Grant succeeded. SQL> exec test2.testproc; PL/SQL procedure successfully completed. |
Эта привилегия также будет актуальна при создании представлений с использованием функций использующих права вызываемого пользователя:
create or replace function test2.testfunc return number authid current_user as retval number; begin execute immediate 'select max(c0) from test1.testtab' into retval; return retval; exception when others then return null; end; / create or replace view test2.testview1 bequeath definer as select testfunc() c0 from dual; create or replace view test2.testview2 bequeath current_user as select testfunc() c0 from dual; grant select on test2.testview1 to test1; grant select on test2.testview2 to test1; |
Представление test2.testview1 ожидаемо не будет работать, будучи объявленным как bequeath definer,
функция, вызываемая в приложении будет выдавать ошибку, т.к. прав на test1.testtab у пользователя test2 нет:
SQL> select * from test2.testview1; select * from test2.testview1 * ERROR at line 1: ORA-00942: table or view does not exist ORA-06512: at "TEST2.TESTFUNC", line 4 |
Проверим как это работает под пользователем test1 для представления объявленного как bequeath current_user:
SQL> revoke inherit privileges on user test1 from test2; Revoke succeeded. SQL> select * from test2.testview2; select * from test2.testview2 * ERROR at line 1: ORA-06598: insufficient INHERIT PRIVILEGES privilege SQL> grant inherit privileges on user test1 to test2; Grant succeeded. SQL> select * from test2.testview2; C0 ---------------- 100 |