Oracle Permissions - PullRequest
       1

Oracle Permissions

2 голосов
/ 13 мая 2011

Для обычного пользователя Oracle (не для администратора баз данных) мне нужно выяснить, какие объекты не принадлежат пользователю, на которого у него есть разрешения, и как он был предоставлен (с помощью какой роли или прямого предоставления).

МожетВы пишете простой сценарий для этого.

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

Я думаю, что это должно дать вам в значительной степени то, что вам нужно.ALL_TAB_PRIVS доступен всем пользователям в базе данных и перечисляет все объекты, на которые у пользователя, выполняющего SELECT, есть разрешения, что это за разрешение и кто его предоставил.Я присоединил его к другому представлению, ROLE_TAB_PRIVS, чтобы найти роль, которая предоставила пользователю привилегию, если таковая имеется.Если пользователю были предоставлены разрешения через роль и прямое предоставление, оба они перечислены.

SELECT atp.grantor, atp.privilege,
       CASE WHEN NVL(rtp.role,'NULL') <> atp.grantee THEN atp.grantee
            ELSE atp.grantee||' (ROLE)'
       END grantee, atp.table_name
  FROM all_tab_privs atp LEFT JOIN role_tab_privs rtp 
                         ON (atp.table_name = rtp.table_name AND 
                             atp.table_schema = rtp.owner)
 WHERE grantor <> 'SYS'    /* Optional - filter out SYS owned objects */
UNION ALL
SELECT owner, 'SELECT' /* Assume SELECT */, NULL, view_name||' (VIEW)'
  FROM all_views
 WHERE owner <> 'SYS' /* Optional - filter out SYS owned views */
ORDER BY 1,3;

РЕДАКТИРОВАТЬ:

ALL_TAB_PRIVS немного неправильное, поскольку включает исполняемый файл PL / SQLобъекты также.

РЕДАКТИРОВАТЬ 2:

Кажется, что это пропускает представления.Вы можете объединить результаты all_views с приведенным выше запросом, чтобы получить все виды, к которым у вас есть какой-то доступ, хотя в настоящий момент я не уверен, как предоставить вам точные привилегии, которые вам были предоставлены для представлений.

Слово предупреждения: включение всех объектов SYS, к которым у вас есть доступ, дает вам довольно обширный список.Вы можете отфильтровать объекты, принадлежащие SYS, как я показал здесь.

0 голосов
/ 13 мая 2011

Это должно получить то, что вы хотите, но применимо только к этому пользователю.

select username
, 'ROL' type
, granted_role pv
from user_role_privs
union
select username
, 'PRV' type
, privilege pv
from user_sys_privs
union
select grantee as username
, 'OBJ' type,
regexp_replace(max(decode(privilege,'WRITE','WRITE,'))||
max(decode(privilege,'READ','READ,'))||
max(decode(privilege,'EXECUTE','EXECUTE')),'WRITE,READ,EXECUTE','ALL')||
regexp_replace(max(decode(privilege,'SELECT','SELECT'))||
max(decode(privilege,'DELETE',',DELETE'))||
max(decode(privilege,'UPDATE',',UPDATE'))||
max(decode(privilege,'INSERT',',INSERT')),'SELECT,DELETE,UPDATE,INSERT','ALL')||
' ON '||object_type||' "'||a.owner||'"."'||table_name||'"' pv
from user_tab_privs a
     , all_objects b
where a.table_name = b.object_name
and a.owner=b.owner
group by a.owner
, table_name
, object_type
, grantee
union
select grantee AS username
, 'COL' type,
privilege||' ('||column_name||') ON "'||owner||'"."'||table_name||'"' pv
from user_col_privs
where grantee=:usercheck
order by 1
, type
, pv;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...