БД Oracle - как отобразить privs между схемами / владельцами? - PullRequest
1 голос
/ 26 августа 2010

У меня есть владелец A и владелец B в БД.У каждой из них есть свои собственные схемы и т. Д. Если я предоставляю права пользователю из B (таким образом, он имеет, например, доступ к некоторому представлению в разделе A), есть ли способ отобразить права доступа, подобные этому?Я имею в виду, что один пользователь имеет некоторые права для каждого владельца БД и его схем.Причина в том, что мне нужно быть уверенным, что ни один пользователь из группы B не имеет доступа к какому-либо объекту из категории A. Большое спасибо

РЕДАКТИРОВАТЬ: Для более ясного вопроса:

Sceham owner A               Schema owner B
Table X                      Table CC
Table Y                      Table DD
View Z                       View EE

Теперь, скажем, пользователь Джон имеет доступ к схемам под владельцем A, но также к одному представлению под схемой, принадлежащим владельцу Oracle B. Как я могу перечислить его права по схемам?

Ответы [ 3 ]

1 голос
/ 26 августа 2010

В Oracle пользователь является схемой (USER = SCHEMA).

Вы можете запросить таблицу словаря DBA_TAB_PRIVS, чтобы узнать, к чему имеют доступ пользователи / роли.Кроме того, если вы подключены как пользователь A, запрос USER_TAB_PRIVS позволит вам узнать, какие пользователи / роли имеют доступ к вашим объектам (таблицам, процедурам, пакетам и т. Д.).

Если есть какие-либо привилегииназначается роли, отметьте DBA_ROLE_PRIVS, чтобы узнать, какому пользователю предоставлена ​​эта роль.

Наконец, отметьте DBA_SYS_PRIVS, чтобы узнать, предоставлены ли глобальные привилегии пользователю / роли.Большинство глобальных привилегий имеют имя ANY (SELECT ANY TABLE, EXECUTE ANY PROCEDURE ...).Глобальные привилегии имеют приоритет над индивидуальными привилегиями и могут позволить вам получить прямой или косвенный доступ к данным во всех схемах.


Это немного усложняется, поскольку роли можно предоставить другую роль.В этом запросе будут перечислены все объекты из схемы A, доступные пользователю JOHN:

SELECT DISTINCT table_name, PRIVILEGE
  FROM dba_tab_privs
 WHERE owner = 'A'
   AND (grantee = 'JOHN' OR
       grantee IN (SELECT dr.granted_role
                      FROM dba_role_privs dr
                     START WITH grantee = 'JOHN'
                    CONNECT BY PRIOR dr.granted_role = dr.grantee))
1 голос
/ 26 августа 2010

Для этого вам потребуется использовать одно из представлений DBA.

select privilege
       , table_name 
from dba_tab_privs
where grantee = 'B'
and owner = 'A'
/

Если вы используете роли, то вы также можете проверить, что:

select r.granted_role
       , p.privilege
       , p.table_name
from dba_role_privs r
     join dba_tab_privs p
     on r.granted_role = p.grantee
where r.grantee = 'B'
and p.owner = 'A'
/

"Как я мог перечислить его права через схемы? "

Как это:

select owner
       , privilege
       , table_name 
from dba_tab_privs
where grantee = 'JOHN'
and owner IN ( 'A', 'B' )
order by owner, table_name
/

Возможно, вы захотите пропустить фильтр на ВЛАДЕЛЬЦА. Аналогичная настройка во втором запросе предоставит вам роли в схемах.

select r.granted_role
       , p.privilege
       , p.table_name
from dba_role_privs r
     join dba_tab_privs p
     on r.granted_role = p.grantee
where r.grantee = 'JOHN'
and p.owner in ( 'A' , 'B')
/
0 голосов
/ 26 августа 2010

Сначала создайте примеры пользователей "user_a" и "user_b":

SQL> create user user_a identified by user_a default tablespace users temporary tablespace temp;
SQL> create user user_b identified by user_b default tablespace users temporary tablespace temp;
SQL> grant connect to user_a, user_b;
SQL> grant create session to user_a, user_b;
SQL> grant create table to user_a, user_b;
SQL> grant create view to user_a, user_b;
SQL> alter user user_a quota unlimited on users;
SQL> alter user user_b quota unlimited on users;

Теперь подключитесь как USER_A и создайте образцы объектов:

SQL> conn user_a/user_a
Connected.
SQL> create table tbl_a(id number, text varchar2(200));
Table created.
SQL> create view view_a as select id, text from tbl_a;
View created.

Затем подключитесь как USER_B и создайте образцы объектов:

SQL> conn user_b/user_b
Connected.
SQL> create table tbl_b(id number, text varchar2(200));
Table created.
SQL> create view view_b as select id, text from tbl_b;
View created.

И, наконец, снова подключитесь как USER_A для поиска для его таблицы TBL_A:

SQL> conn user_a/user_a
Connected.
SQL> select count(1) from ALL_TAB_PRIVS where grantor = 'USER_A' and PRIVILEGE = 'SELECT' and GRANTEE = 'USER_B';

Out is:

  COUNT(1)
----------
         0

Теперь предоставьте право выбора при просмотреVIEW_A для USER_B:

SQL> grant select on view_a to user_b;
Grant succeeded.

И снова попробуйте поиск грантов для USER_B для просмотра объекта VIEW_A от USER_A:

SQL> select count(1) from ALL_TAB_PRIVS where grantor = 'USER_A' and PRIVILEGE = 'SELECT' and GRANTEE = 'USER_B';

А теперь результат:

  COUNT(1)
----------
         1
...