Как найти привилегии и роли, предоставленные пользователю в Oracle?
Я использую Linux, Oracle10g. Я создал одного пользователя с именем test. и предоставлено создать сеанс и выбрать любое разрешение словаря для того же пользователя.
Я также предоставил роли sysdba и sysoper одним и тем же пользователям.
теперь я хочу отобразить все привилегии и роли, предоставленные пользователю. Я нашел следующий запрос, но он показывает только создать сеанс и выбрать привилегии словаря.
select privilege
from dba_sys_privs
where grantee='SAMPLE'
order by 1;
пожалуйста, помогите решить вопрос.
спасибо
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') )
всегда делайте 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 ;