Я думаю, что это должно дать вам в значительной степени то, что вам нужно.ALL_TAB_PRIVS доступен всем пользователям в базе данных и перечисляет все объекты, на которые у пользователя, выполняющего SELECT, есть разрешения, что это за разрешение и кто его предоставил.Я присоединил его к другому представлению, ROLE_TAB_PRIVS, чтобы найти роль, которая предоставила пользователю привилегию, если таковая имеется.Если пользователю были предоставлены разрешения через роль и прямое предоставление, оба они перечислены.
SELECT atp.grantor, atp.privilege,
CASE WHEN NVL(rtp.role,'NULL') <> atp.grantee THEN atp.grantee
ELSE atp.grantee||' (ROLE)'
END grantee, atp.table_name
FROM all_tab_privs atp LEFT JOIN role_tab_privs rtp
ON (atp.table_name = rtp.table_name AND
atp.table_schema = rtp.owner)
WHERE grantor <> 'SYS' /* Optional - filter out SYS owned objects */
UNION ALL
SELECT owner, 'SELECT' /* Assume SELECT */, NULL, view_name||' (VIEW)'
FROM all_views
WHERE owner <> 'SYS' /* Optional - filter out SYS owned views */
ORDER BY 1,3;
РЕДАКТИРОВАТЬ:
ALL_TAB_PRIVS немного неправильное, поскольку включает исполняемый файл PL / SQLобъекты также.
РЕДАКТИРОВАТЬ 2:
Кажется, что это пропускает представления.Вы можете объединить результаты all_views с приведенным выше запросом, чтобы получить все виды, к которым у вас есть какой-то доступ, хотя в настоящий момент я не уверен, как предоставить вам точные привилегии, которые вам были предоставлены для представлений.
Слово предупреждения: включение всех объектов SYS, к которым у вас есть доступ, дает вам довольно обширный список.Вы можете отфильтровать объекты, принадлежащие SYS, как я показал здесь.