Відповіді:
Якщо ви хочете отримати більше, ніж просто прямі гранти таблиці (наприклад, гранти через ролі, системні привілеї, такі як вибір будь-якої таблиці тощо), ось кілька додаткових запитів:
Системні привілеї для користувача:
SELECT PRIVILEGE
FROM sys.dba_sys_privs
WHERE grantee = <theUser>
UNION
SELECT PRIVILEGE
FROM dba_role_privs rp JOIN role_sys_privs rsp ON (rp.granted_role = rsp.role)
WHERE rp.grantee = <theUser>
ORDER BY 1;
Прямі гранти для таблиць / переглядів:
SELECT owner, table_name, select_priv, insert_priv, delete_priv, update_priv, references_priv, alter_priv, index_priv
FROM table_privileges
WHERE grantee = <theUser>
ORDER BY owner, table_name;
Непрямі гранти для таблиць / переглядів:
SELECT DISTINCT owner, table_name, PRIVILEGE
FROM dba_role_privs rp JOIN role_tab_privs rtp ON (rp.granted_role = rtp.role)
WHERE rp.grantee = <theUser>
ORDER BY owner, table_name;
role_role_privs
столу, а потім CONNECT BY PRIOR granted_role = role
повторити перехід до привілеїв на перехідну роль ...
Вибачте, хлопці, але вибираючи з all_tab_privs_recd, де grantee = 'ваш користувач' не дасть жодного результату, окрім загальнодоступних грантів та поточних грантів користувачів, якщо ви запускаєте вибір від іншого (скажімо, SYS) користувача. Як говорить документація,
ALL_TAB_PRIVS_RECD описує такі типи грантів:
Object grants for which the current user is the grantee Object grants for which an enabled role or PUBLIC is the grantee
Отже, якщо ви DBA і хочете перерахувати всі дотації об’єктів для конкретного користувача (а не для самого SYS), ви не можете використовувати цей системний вигляд.
У цьому випадку потрібно виконати більш складний запит. Ось один, взятий (простежений) від TOAD, щоб вибрати всі грантові об’єкти для конкретного користувача:
select tpm.name privilege,
decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable,
ue.name grantee,
ur.name grantor,
u.name owner,
decode(o.TYPE#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER',
4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',
7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
11, 'PACKAGE BODY', 12, 'TRIGGER',
13, 'TYPE', 14, 'TYPE BODY',
19, 'TABLE PARTITION', 20, 'INDEX PARTITION', 21, 'LOB',
22, 'LIBRARY', 23, 'DIRECTORY', 24, 'QUEUE',
28, 'JAVA SOURCE', 29, 'JAVA CLASS', 30, 'JAVA RESOURCE',
32, 'INDEXTYPE', 33, 'OPERATOR',
34, 'TABLE SUBPARTITION', 35, 'INDEX SUBPARTITION',
40, 'LOB PARTITION', 41, 'LOB SUBPARTITION',
42, 'MATERIALIZED VIEW',
43, 'DIMENSION',
44, 'CONTEXT', 46, 'RULE SET', 47, 'RESOURCE PLAN',
66, 'JOB', 67, 'PROGRAM', 74, 'SCHEDULE',
48, 'CONSUMER GROUP',
51, 'SUBSCRIPTION', 52, 'LOCATION',
55, 'XML SCHEMA', 56, 'JAVA DATA',
57, 'EDITION', 59, 'RULE',
62, 'EVALUATION CONTEXT',
'UNDEFINED') object_type,
o.name object_name,
'' column_name
from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue,
table_privilege_map tpm
where oa.obj# = o.obj#
and oa.grantor# = ur.user#
and oa.grantee# = ue.user#
and oa.col# is null
and oa.privilege# = tpm.privilege
and u.user# = o.owner#
and o.TYPE# in (2, 4, 6, 9, 7, 8, 42, 23, 22, 13, 33, 32, 66, 67, 74, 57)
and ue.name = 'your user'
and bitand (o.flags, 128) = 0
union all -- column level grants
select tpm.name privilege,
decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable,
ue.name grantee,
ur.name grantor,
u.name owner,
decode(o.TYPE#, 2, 'TABLE', 4, 'VIEW', 42, 'MATERIALIZED VIEW') object_type,
o.name object_name,
c.name column_name
from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue,
sys.col$ c, table_privilege_map tpm
where oa.obj# = o.obj#
and oa.grantor# = ur.user#
and oa.grantee# = ue.user#
and oa.obj# = c.obj#
and oa.col# = c.col#
and bitand(c.property, 32) = 0 /* not hidden column */
and oa.col# is not null
and oa.privilege# = tpm.privilege
and u.user# = o.owner#
and o.TYPE# in (2, 4, 42)
and ue.name = 'your user'
and bitand (o.flags, 128) = 0;
Тут буде вказано всі грантові об’єкти (включаючи грантові стовпці) для вашого (вказаного) користувача. Якщо ви не бажаєте дозволів на рівні стовпців, тоді видаліть усю частину вибору, починаючи з пункту "об'єднання".
UPD: Вивчаючи документацію, я знайшов інший погляд, який перераховує всі гранти набагато простішим способом:
select * from DBA_TAB_PRIVS where grantee = 'your user';
Майте на увазі, що в Oracle немає перегляду DBA_TAB_PRIVS_RECD.
Найбільш повний і надійний метод, який я знаю, все ще використовується за допомогою DBMS_METADATA :
select dbms_metadata.get_granted_ddl( 'SYSTEM_GRANT', :username ) from dual;
select dbms_metadata.get_granted_ddl( 'OBJECT_GRANT', :username ) from dual;
select dbms_metadata.get_granted_ddl( 'ROLE_GRANT', :username ) from dual;
Хоча цікаві відповіді.
select distinct 'GRANT '||privilege||' ON '||OWNER||'.'||TABLE_NAME||' TO '||RP.GRANTEE
from DBA_ROLE_PRIVS RP join ROLE_TAB_PRIVS RTP
on (RP.GRANTED_ROLE = RTP.role)
where (OWNER in ('YOUR USER') --Change User Name
OR RP.GRANTEE in ('YOUR USER')) --Change User Name
and RP.GRANTEE not in ('SYS', 'SYSTEM')
;
Наступний запит можна використовувати для отримання всіх привілеїв одного користувача. Просто введіть ім’я користувача в першому запиті, і ви отримаєте всі привілеї до цього
З користувачами AS (SELECT 'SCHEMA_USER' usr FROM dual), Roles AS (SELECT dod_role FROM dba_role_privs rp ПРИЄДНАЙТЕСЬ до користувачів ON rp.GRANTEE = users.usr UNION SELECT dod_role FROM role_role_privs WHERE роль IN (SELECT given_role ROS__RP___RP___DER_SER_DOWS_DOW_SER_DOWS_DOW_SER_DOWS) грантозаявітель = users.usr)), tab_privilage AS (SELECT, ПІДПРИЄМЕЦЬ, TABLE_NAME, ПРИВІЛЕЙ ВІД role_tab_privs РЕЄСТРУЙСЯ ролі РТПА г на rtp.role = r.granted_role UNION SELECT, власник, TABLE_NAME, привілеї Dba_Tab_Privs DTP JOIN користувачів на dtp.grantee = користувачі. usr), sys_privileges AS (ВИБРАТИ привілей ВІД dba_sys_privs dsp ПРИЄДНАЙТЕ користувачів на dsp.grantee = users.usr) ВИБІР * ВІД ВІД ВИДАЛЕННЯ ЗАМОВЛЕННЯ власником, table_name - ВИБІР * ВІД sys_privileges