我应该运行什么查询来简单地查看用户是否具有执行存储过程的权限。
假设用户是UserA
,而存储过程的名称是my_stored_proc
我想知道UserA
是否对my_stored_proc
具有执行权限。
UserA
不是存储过程的所有者,某个其他所有者授予了他权限。
我应该运行什么查询来简单地查看用户是否具有执行存储过程的权限。
假设用户是UserA
,而存储过程的名称是my_stored_proc
我想知道UserA
是否对my_stored_proc
具有执行权限。
UserA
不是存储过程的所有者,某个其他所有者授予了他权限。
要考虑到通过角色的授权:
select grantee, table_name, privilege
from dba_tab_privs
where
table_name = 'my_stored_proc'
and
owner = 'ownerOfObject'
and
(grantee = 'userA'
or
grantee in
(select granted_role
from dba_role_privs
where grantee = 'userA'
)
)
select ap.*
from All_Procedures ap
where ap.owner = 'UserA'
这只告诉你UserA是否是所有者。我想即使不是所有者,UserA仍然可能有权限。不确定如何检查。
编辑: 其他要检查的表包括
USER_SYS_PRIVS USER_TAB_PRIVS USER_ROLE_PRIVS ROLE_SYS_PRIVS ROLE_TAB_PRIVS
我很少查询这些表,所以我不确定如何找到您要查找的内容,但我会从这些开始。
明白了...
SELECT * FROM DBA_TAB_PRIVS A WHERE GRANTEE = 'UserA' AND GRANTOR = 'someoneelse' and privilege = 'EXECUTE'
这是我使用的方法,我想找到所有我有权限访问的存储过程:
select * from USER_TAB_PRIVS where GRANTEE='______' and PRIVILEGE='EXECUTE'
USER_TAB_PRIVS 中包括 GRANTEE、OWNER、GRANTOR、TABLE_NAME(在本例中为 SP 名称)和 PRIVILEGE 列,所以我认为这是完美的。
我的理解是 dpbradley 和 Omnipresent 的答案对于普通用户不起作用,因为他们无法访问 DBA_* 表。