Як знайти привілеї та ролі, надані користувачеві в Oracle? [дублікат]


77

Я використовую Linux, Oracle10g. Я створив одного користувача, який називається test. і надано сеанс створення та виберіть будь-який дозвіл на словник для того самого користувача.

Я також надав ролі sysdba та sysoper тим самим користувачам.

Тепер я хочу відобразити всі привілеї та ролі, надані користувачеві. Я знайшов наступний запит, але він показує лише права на створення сеансу та вибір словника.

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

будь ласка, допоможіть вирішити проблему.

Дякую


Ви можете використовувати Документацію словника даних
Слава Бабін,

Відповіді:


61

Подивись на 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_SYS_PRIVS; 
SELECT * FROM USER_TAB_PRIVS; 
SELECT * FROM USER_ROLE_PRIVS;

37
Іншими словами, складайте SELECT * FROMці таблиці. Не будемо лінуватися ... Я засмучуюсь, коли не бачу коду. Не кожен може прочитати ваші думки щодо точного синтаксису, і посилання на документацію можуть переміщуватися.
vapcguy

12
Для ледачих там: SELECT * FROM USER_SYS_PRIVS; SELECT * FROM USER_TAB_PRIVS; SELECT * FROM USER_ROLE_PRIVS;
Віктор Романо

1
якщо ви людина, яка шукає ролі, призначені "будь-якому в базі даних", як я, USER_ROLE_PRIVSне буде працювати для вас, оскільки: "USER_ROLE_PRIVS описує ролі, надані поточному користувачеві", як сказано в документації Oracle. Натомість вам слід шукати інформацію у DBA_ROLE_PRIVSподанні. ¿Чому? Тому що: "DBA_ROLE_PRIVS описує ролі, надані всім користувачам, і ролі в базі даних"
Адріан

70

На додаток до відповіді VAV, Перша була найбільш корисною в моєму середовищі

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

8
+1 дуже повний. Помістіть "користувач" замість зразка, щоб отримати інформацію про поточного зареєстрованого користувача
daitangio

3
Примітка. Якщо ви використовуєте dba_XXX_privs, ім'я стовпця granteeзамість username.
Містер Лама,

57

Жодна з інших відповідей не працювала для мене, тому я написав власне рішення:

Станом на 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 і видалити речення WHERE.


Це найкраща відповідь. Дякую.
Баодад

Ось ще один, щоб його завершити - системні привілеї, надані ролі, наданій користувачеві: SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE IN (ВИБІР наданої_РОЛИ З DBA_ROLE_PRIVS WHERE GRANTEE = 'DWMGR');
em_bo

10

ЯКЩО привілеї надаються користувачеві через деякі ролі, тоді нижче 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';

дуже корисно глибше заглибитися, коли у вас є права, надані через ролі .. Другий запит мені дуже допоміг перевірити, чи надано мені одне наше право доступу до таблиці.
nanosoft

9

Поєднуючи попередні пропозиції для визначення ваших особистих дозволів (тобто дозволів "USER"), скористайтеся цим:

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

1
Відмінно! Це має бути справжньою відповіддю!
vapcguy

Я думаю, що це найкраща відповідь. Для мене це працює дуже добре.
Дієго Ромеро Родрігес


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

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
;

Тільки перевіряє ROLESгрупу на певну роль. Якщо ми говоримо про багаторазове використання, воно повинно 1) пройти через USERгрупу і виплюнути *з USER_ROLE_PRIVS, USER_TAB_PRIVSі USER_SYS_PRIVS , для даного користувача, потім 2) дати ролі для даного користувача, який вводиться (як у відповіді ShamrockCS). Думаю, враховуючи питання OP, саме тут ми хочемо знати властивості даного користувача, а не користувачів із заданою роллю.
vapcguy

0

Єдиним видимим результатом, який я зміг зрозуміти, було спочатку встановити зв’язок із користувачем, на якого я хотів отримати права, а потім із наступним запитом:

SELECT GRANTEE, PRIVILEGE, TABLE_NAME FROM USER_TAB_PRIVS;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.