
最近微信群朋友的对话,
A: 如何查询某个用户下能执行哪些存储过程?
B: dba_tab_privs可以看到的
A: 好像这个视图只能查询用户拥有的表权限啊
B: 你授权过了,table_name就是包、过程的名称
究竟是不是这样?
首先,说明一下,用dba_tab_privs和user_tab_privs这两个都是可以的,和一般的dba_/user_视图适用范围相同,

DBA_TAB_PRIVS
describes all object grants in the database.
USER_TAB_PRIVS
describes the object grants for which the current user is the object owner, grantor, or grantee.
场景1. 用户属主的存储过程,授权给自己
用户BISAL下创建存储过程,授权自己,
SQL create or replace procedure p AS BEGIN dbms_output.put_line('procedure'); END; / Procedure created.
SQL grant execute on p to bisal; Grant succeeded.
此时user_tab_privs视图为空,可以理解为对象就是自己的,没必要进行授权,反过来看,不能将对象权限,从属主身上删除,
SQL select table_name from user_tab_privs; no rows selected
场景2. 用户属主的存储过程,授权给其他用户
用户STAR下创建存储过程,授权给用户BISAL,
SQL create or replace procedure ap AS BEGIN dbms_output.put_line('procedure'); END; / Procedure created.
SQL grant execute on ap to bisal; Grant succeeded.
BISAL用户下检索user_tab_privs视图,有了记录,表明用户STAR(GRANTOR)的AP对象,授权用户BISAL(GRANTEE),可有执行权限(EXECUTE),

其实使用STAR,检索是相同的,换句话说,虽然用的USER_视图,但是对于BISAL用户,GRANTEE,被授予了存储过程AP执行权限,对于STAR用户来说,GRANTOR,授予了存储过程AP执行权限,属于object grants in the database范畴,(EXECUTE可以drop procedure)
DBA_TAB_PRIVS
describes all object grants in the database.
USER_TAB_PRIVS
describes the object grants for which the current user is the object owner, grantor, or grantee.
“all object”表示不仅可以检索存储过程,可以检索其他的对象,除了存储过程,我们看看授予表对象权限,
BISAL用户下有一张表A,授予SELECT权限给用户STAR,
SQL grant select on a to star; Grant succeeded.
无论使用BISAL,还是STAR用户,均可以进行检索,
授予所有权限,
SQL grant select on a to star; Grant succeeded.
检索user_tab_privs视图,
细心的朋友可能已经发现,*_tab_privs显示的结果中,没有指出对象的类型,比如我这么操作,
SQL rename a to ap; Table renamed.
检索user_tab_privs,可以看见这里TABLE_NAME,两个都是AP,无法区分是什么类型的对象,

上面是版本11.2.0.4显示,但是看12c以及18c文档,针对这张视图,已经增加了type类型,
12c手册,

18c手册,

这是Live SQL显示的检索,即18c下的检索显示,

Oracle已经意识到11g中*_tab_privs视图需要type,于是在新版本中,增加了这个字段信息,现在看着就方便了些。
如果您觉得本文有帮助,欢迎关注转发:bisal的个人杂货铺,

