2013-02-25 2 views
50

Я использую Linux, Oracle10g. Я создал один пользователь, который называется test. и предоставил создать сеанс и выбрать любой словарь для одного и того же пользователя.Как найти привилегии и роли, предоставленные пользователю в Oracle?

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

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

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

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

Благодаря

+0

Вы можете использовать [Документацию по словарю данных] (http://stackoverflow.com/documentation/oracle/7347/data-dictionary#t=201610091552406899855) –

ответ

29

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

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

+14

Другими словами, сделайте 'SELECT * FROM' эти таблицы. Давайте не будем лениться ... Я расстраиваюсь, когда не вижу кода. Не каждый может читать ваши мысли для точного синтаксиса, и ссылки на документацию могут быть перемещены. – vapcguy

+0

Идеальный ответ. Прямо в точку. – Doogle

+1

Для ленивых там: 'SELECT * FROM USER_SYS_PRIVS;' ' SELECT * FROM USER_TAB_PRIVS;' ' SELECT * FROM USER_ROLE_PRIVS;' –

0
SELECT * 
FROM DBA_ROLE_PRIVS 
WHERE UPPER(GRANTEE) LIKE '%XYZ%'; 
+0

Привет ... Почему мы должны использовать, если мы знаем точное имя. LIKE делает запрос дорогостоящим .... – Avrajit

1
select * 
from ROLE_TAB_PRIVS 
where role in (
    select granted_role 
    from dba_role_privs 
    where granted_role in ('ROLE1','ROLE2') 
) 
46

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

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

+1 очень полный. Поместите «пользователь» вместо образца, чтобы получить информацию о текущем зарегистрированном пользователе – daitangio

+1

Примечание: если вы используете 'dba_XXX_privs', имя столбца -' grantee' вместо 'username'. –

8

Если льготы предоставляются пользователю через несколько ролей, то ниже 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'; 
+0

очень полезно копать глубже, когда у вас есть права, предоставляемые через роли. Второй запрос помог мне много узнать, предоставляется ли мне право на доступ к нашему столу. – nanosoft

4

Соединив более ранние предложения по определению ваших личных разрешений (например, разрешения «USER»), используйте t его:

-- 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); 
+0

Отлично! Это должен быть реальный ответ! – vapcguy

0

всегда делает 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 
; 
+0

Проверяет только группу 'ROLES' для данной роли. Если мы говорим о повторном использовании, он должен: 1) пропустить группу 'USER' и выплюнуть' * 'из' USER_ROLE_PRIVS', 'USER_TAB_PRIVS' и' USER_SYS_PRIVS' для данного пользователя, затем 2) предоставить роли для данный пользователь, который вводится (например, в ответ ShamrockCS). Я думаю, что, учитывая вопрос OP, мы хотим знать свойства данного пользователя, а не пользователей с заданной ролью. – vapcguy

21

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

По Oracle 11g ,

Заменить USER с желаемым именем пользователя

Предоставленные Роли:

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 и удалить ИНЕКЕ ,

+0

Это лучший ответ. Благодарю. – Baodad

Смежные вопросы