查当前用户系统权限应优先用user_sys_privs视图,它无需dba权限、不报ora-00942,返回直授及角色继承的生效权限;若需实时会话权限则查session_privs。

查当前用户有哪些系统权限,用 USER_SYS_PRIVS
直接查 USER_SYS_PRIVS 就行,不需要 DBA 权限,也不用担心报 ORA-00942。它返回的是当前会话「实际生效」的系统权限,包括直授的和通过角色继承来的:
-
SELECT PRIVILEGE FROM USER_SYS_PRIVS;—— 最简写法,只关心权限名 - 结果里不会出现
CREATE SESSION,这是正常的:它属于连接时隐式授予的权限,不落视图 -
ADMIN_OPTION列在 Oracle 11g 及之后版本恒为NO,不可信,别当真 - 如果刚执行过
SET ROLE resource;,USER_SYS_PRIVS不会立刻更新——它反映的是授权快照,不是实时状态
想看「此刻真实能用」的权限,查 SESSION_PRIVS
当你怀疑权限没生效、角色没激活、或者刚切换过角色,SESSION_PRIVS 是唯一能反映运行时真实能力的视图:
-
SELECT * FROM SESSION_PRIVS;—— 结构最干净,只有一列PRIVILEGE - 执行
SET ROLE ALL;后立刻刷新,而USER_SYS_PRIVS不变 - 它不包含对象权限,也不管权限来源(角色 or 直授),只回答一个问题:“我现在能干啥?”
- 普通用户也能查,无权限依赖,比
USER_SYS_PRIVS更轻量
为什么查不到某些“明明有”的权限?
常见原因不是 SQL 写错,而是权限路径没走对:
-
DBA_SYS_PRIVS只记录直授权限,比如GRANT CREATE TABLE TO scott;;但scott如果是通过RESOURCE角色获得CREATE TABLE,这条记录就不会出现在DBA_SYS_PRIVS里 -
CREATE SESSION永远不会出现在任何系统权限视图中——只要连得上库,它就在 - 查
USER_SYS_PRIVS或SESSION_PRIVS却没看到某个权限,先确认对应的角色是否已激活(查SESSION_ROLES) - 如果需要溯源权限来自哪个角色,得补查:
SELECT GRANTED_ROLE FROM USER_ROLE_PRIVS;,再对每个角色查ROLE_SYS_PRIVS
查别人权限必须用 DBA_SYS_PRIVS,但先确认你有没有权限
想查 SCOTT 有哪些直授系统权限,语句是:
SELECT privilege, admin_option FROM DBA_SYS_PRIVS WHERE grantee = 'SCOTT';
- 用户名必须大写,
'scott'查不到 - 执行就报
ORA-00942: table or view does not exist?说明你没SELECT_CATALOG_ROLE或 DBA 权限,别硬试 -
ADMIN_OPTION = 'YES'表示该用户能用WITH ADMIN OPTION再转授,但这不等于当前会话已启用该权限 - 生产环境做权限审计时,单靠
DBA_SYS_PRIVS会漏掉 70% 以上权限,必须递归查角色链
角色嵌套不自动展开——APP_ADMIN 包含 SELECT_CATALOG_ROLE,后者所带权限不会自动出现在查询结果里,得手动再查一层。











