Если привилегия была предоставлена непосредственно или роли, грант появится в DBA_TAB_PRIVS
SELECT grantee, privilege
FROM dba_tab_privs
WHERE owner = 'B'
AND table_name = 'MYPACKAGE'
AND privilege = 'EXECUTE'
Если grantee
это роль, вам нужно будет посмотреть, dba_role_privs
какие пользователи (или роли) получили эту роль, и следовать цепочке, если у вас есть роли, предоставленные другим ролям. Если вам нужно учитывать пользователей, которые имеют гранты из-за (очень опасных) ANY
грантов (то есть EXECUTE ANY PROCEDURE
), для этого потребуется отдельный запрос.
Если вы хотите стать более сложным, чем просто выполнять простой запрос dba_tab_privs
, вам, вероятно, лучше использовать сценарии Пита Финнигана, такие как who_has_priv.sql
(или who_has_priv_procedure.sql
). Пит, вероятно, является ведущим экспертом в области безопасности Oracle, поэтому они с большей вероятностью будут учитывать все возможные варианты, чем все, что я пытался бы объединить.