Мне нужно увидеть все гранты по БД Oracle.
Я использовал функцию TOAD для сравнения схем, но она не показывает заманчивые гранты и т. Д., Поэтому есть мой вопрос:
Как я могу перечислить все гранты в базе данных Oracle?
Если вам нужно больше, чем просто прямые гранты таблицы (например, гранты через роли, системные привилегии, такие как выбор любой таблицы и т. Д.), Вот несколько дополнительных запросов:
Системные привилегии для пользователя:
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
вместо этого просмотр.источник
Извините, ребята, но выбор из all_tab_privs_recd, где grantee = 'your user' не даст никаких результатов, кроме публичных грантов и текущих пользовательских грантов, если вы запустите выбор от другого (скажем, SYS) пользователя. Как говорится в документации,
Итак, если вы администратор базы данных и хотите перечислить все гранты объектов для определенного (не самого SYS) пользователя, вы не можете использовать это системное представление.
В этом случае вы должны выполнить более сложный запрос. Вот пример, взятый (отслеженный) из TOAD для выбора всех грантов объекта для конкретного пользователя:
В нем будут перечислены все гранты объекта (включая гранты столбцов) для вашего (указанного) пользователя. Если вам не нужны гранты на уровне столбца, удалите всю часть выбора, начинающуюся с предложения union.
UPD: Изучая документацию, я нашел еще одно представление, в котором все гранты перечислены гораздо проще:
Имейте в виду, что в Oracle нет представления DBA_TAB_PRIVS_RECD.
источник
Самый полный и надежный метод, который я знаю, - это использование DBMS_METADATA :
Хотя и интересные ответы.
источник
источник
Следующий запрос можно использовать для получения всех привилегий одного пользователя. Просто укажите имя пользователя в первом запросе, и вы получите все права для этого
С пользователями КАК (ВЫБЕРИТЕ 'SCHEMA_USER' usr FROM dual), Роли КАК (ВЫБЕРИТЕ grant_role FROM dba_role_privs rp СОЕДИНЯЙТЕ пользователей НА rp.GRANTEE = users.usr СОЕДИНЕНИЕ ВЫБЕРИТЕ grant_role FROM role_role_privs ГДЕ роль IN (ВЫБЕРИТЕ предоставленную_роль FROM rp_role_privs НА rp.privs_privs на rp_role_privs. GRANTEE = users.usr)), tab_privilage AS (SELECT OWNER, TABLE_NAME, PRIVILEGE FROM role_tab_privs rtp JOIN roles r ON rtp.role = r.granted_role UNION SELECT OWNER, TABLE_NAME, PRIVILEGE FROM Dba Users_Tabtee_Privs dn. usr), sys_privileges AS (привилегия SELECT FROM dba_sys_privs dsp JOIN users ON dsp.grantee = users.usr) SELECT * FROM tab_privilage ORDER BY owner, table_name --SELECT * FROM sys_privileges
источник