如何查询某个用户下能执行哪些存储过程?

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 如何查询某个用户下能执行哪些存储过程?

如何查询某个用户下能执行哪些存储过程?

最近微信群朋友的对话,

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的个人杂货铺,

如何查询某个用户下能执行哪些存储过程? 如何查询某个用户下能执行哪些存储过程?
本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 如何查询某个用户下能执行哪些存储过程?


 上一篇
如何使用TTS进行数据复制 如何使用TTS进行数据复制
测试同学有一个需求,需要将应用某一个版本,对应的数据库信息复制一份,通过了解,整理需求如下: 原始数据库IP:10.1.1.1 目标数据库IP:10.1.1.2 将原始数据库的用户USER_A,所有对象(表、索引、序列),复
下一篇 
时间间隔分区,及其默认表空间的几个使用场景 时间间隔分区,及其默认表空间的几个使用场景
这次上线,会将一张普通表,变为分区表,准确地说,是时间间隔分区,这是11g的新特性,可以避免人工创建分区,当有新数据进来,他会创建新分区,以及相应的local分区索引,语法如下,原始语法基础上,增加关键字INTERVAL,里面可以