Как найти привилегии и роли, предоставленные пользователю в Oracle?


Я использую Linux, Oracle10g. Я создал одного пользователя с именем test. и предоставлено создать сеанс и выбрать любое разрешение словаря для того же пользователя.

Я также предоставил роли sysdba и sysoper одним и тем же пользователям.

теперь я хочу отобразить все привилегии и роли, предоставленные пользователю. Я нашел следующий запрос, но он показывает только создать сеанс и выбрать привилегии словаря.

select privilege 
from dba_sys_privs 
where grantee='SAMPLE' 
order by 1;

пожалуйста, помогите решить вопрос.

спасибо

8 61

8 ответов:

посмотрите на http://docs.oracle.com/cd/B10501_01/server.920/a96521/privs.htm#15665

Проверьте таблицы USER_SYS_PRIVS, USER_TAB_PRIVS, USER_ROLE_PRIVS.

в дополнение к ответу ВАВ, первый был наиболее полезен в моей среде

select * from USER_ROLE_PRIVS where USERNAME='SAMPLE';
select * from USER_TAB_PRIVS where Grantee = 'SAMPLE';
select * from USER_SYS_PRIVS where USERNAME = 'SAMPLE';

ни один из других ответов не работал для меня, поэтому я написал свое собственное решение:

по состоянию на Oracle 11g.

замените пользователя на желаемое имя пользователя

Назначенные Роли:

SELECT * 
  FROM DBA_ROLE_PRIVS 
 WHERE GRANTEE = 'USER';

Привилегии, Предоставленные Непосредственно Пользователю:

SELECT * 
  FROM DBA_TAB_PRIVS 
 WHERE GRANTEE = 'USER';

привилегии, предоставленные роли, предоставленной пользователю:

SELECT * 
  FROM DBA_TAB_PRIVS  
 WHERE GRANTEE IN (SELECT granted_role 
                     FROM DBA_ROLE_PRIVS 
                    WHERE GRANTEE = 'USER');

Предоставлен Системой Привилегии:

SELECT * 
  FROM DBA_SYS_PRIVS 
 WHERE GRANTEE = 'USER';

если вы хотите найти пользователя, с которым вы в настоящее время связаны, вы можете заменить DBA в имени таблицы на USER и удалить предложение WHERE.

если привилегии предоставляются пользователю через некоторые роли, то ниже SQL может быть использован

select * from ROLE_ROLE_PRIVS where ROLE = 'ROLE_NAME';
select * from ROLE_TAB_PRIVS  where ROLE = 'ROLE_NAME';
select * from ROLE_SYS_PRIVS  where ROLE = 'ROLE_NAME';

объединение предыдущих предложений для определения ваших личных разрешений (т. е. разрешений "пользователя"), а затем используйте это:

-- your permissions
select * from USER_ROLE_PRIVS where USERNAME= USER;
select * from USER_TAB_PRIVS where Grantee = USER;
select * from USER_SYS_PRIVS where USERNAME = USER;

-- granted role permissions
select * from ROLE_ROLE_PRIVS where ROLE IN (select granted_role from USER_ROLE_PRIVS where USERNAME= USER);
select * from ROLE_TAB_PRIVS  where ROLE IN (select granted_role from USER_ROLE_PRIVS where USERNAME= USER);
select * from ROLE_SYS_PRIVS  where ROLE IN (select granted_role from USER_ROLE_PRIVS where USERNAME= USER);
select * 
from ROLE_TAB_PRIVS 
where role in (
    select granted_role
    from dba_role_privs 
    where granted_role in ('ROLE1','ROLE2')
)
SELECT * 
FROM DBA_ROLE_PRIVS 
WHERE UPPER(GRANTEE) LIKE '%XYZ%';

всегда делайте SQL повторно используемым: -:)

-- ===================================================
-- &role_name will be "enter value for 'role_name'".
-- Date:  2015 NOV 11.

-- sample code:   define role_name=&role_name
-- sample code:   where role like '%&&role_name%'
-- ===================================================


define role_name=&role_name

select * from ROLE_ROLE_PRIVS where ROLE = '&&role_name';
select * from ROLE_SYS_PRIVS  where ROLE = '&&role_name';


select role, privilege,count(*)
 from ROLE_TAB_PRIVS
where ROLE = '&&role_name'
group by role, privilege
order by role, privilege asc
;