如何通过USER_SYS_PRIVS视图查询Oracle 11g中当前用户的所有系统权限?
- 内容介绍
- 文章标签
- 相关推荐
本文共计830个文字,预计阅读时间需要4分钟。
相关专题内容摘要:
user_sys_privs 是最直接、最安全的方式查当前用户系统权限,不需要 dba 权限,也不依赖其他角色或视图嵌套。
为什么用 USER_SYS_PRIVS 而不是 DBA_SYS_PRIVS
因为 DBA_SYS_PRIVS 只对有 DBA 角色或 SELECT_CATALOG_ROLE 的用户开放;普通开发账号执行会报 ORA-00942: table or view does not exist。而 USER_SYS_PRIVS 是每个登录用户都能访问的视图,只返回「当前会话实际生效」的系统权限(包括直授的 + 通过角色继承来的)。
注意:USER_SYS_PRIVS 不显示 ADMIN_OPTION 列 —— 这意味着它不告诉你是否有「带 ADMIN 选项」的授权(比如能否再转授给他人),这点容易被忽略。
USER_SYS_PRIVS 返回字段含义和常见陷阱
该视图返回三列:PRIVILEGE(权限名)、ADMIN_OPTION(Oracle 11g 中此列恒为 NO,不可信)、COMMON(仅在 CDB 环境有意义,11g 单机库始终为 NO)。
- 真正可用的只有
PRIVILEGE字段,例如CREATE TABLE、UNLIMITED TABLESPACE - 如果查不到
CREATE SESSION,不代表不能连库 —— 它是连接时隐式授予的,不会出现在USER_SYS_PRIVS中 - 若用户通过角色获得权限(如
RESOURCE),USER_SYS_PRIVS仍会列出该角色所含的系统权限(如CREATE SEQUENCE),但不会注明来源是哪个角色
配合 SESSION_PRIVS 查看「此刻生效」的权限
SESSION_PRIVS 是更轻量的替代方案:它只返回当前会话已激活的系统权限(不含被 REVOKE 但未重连的残留项),且查询更快、无权限依赖。
执行:
SELECT * FROM SESSION_PRIVS;
- 结果与
USER_SYS_PRIVS高度重合,但更贴近真实运行时状态 - 不包含
ADMIN_OPTION或COMMON,结构更干净 - 如果你刚执行
SET ROLE切换角色,SESSION_PRIVS会立即反映变化,而USER_SYS_PRIVS不会
别漏掉角色间接带来的权限
USER_SYS_PRIVS 虽然会展开角色里的系统权限,但它不告诉你「哪些角色带来了哪些权限」。如果需要溯源,必须补查:
SELECT GRANTED_ROLE FROM USER_ROLE_PRIVS;
再对每个角色查:
SELECT PRIVILEGE FROM ROLE_SYS_PRIVS WHERE ROLE = 'RESOURCE';
- 典型组合如
CONNECT+RESOURCE,实际赋予了CREATE SESSION、CREATE TABLE、CREATE SEQUENCE等共约 15 项系统权限 - 如果发现某权限存在但不知道来源,先查
USER_ROLE_PRIVS,再逐个查ROLE_SYS_PRIVS,这是最稳的排查链
真正难的是判断权限是否「可传播」或「受限制」——USER_SYS_PRIVS 完全不提供这些上下文,得靠人工交叉核对角色定义和授权语句。
本文共计830个文字,预计阅读时间需要4分钟。
相关专题内容摘要:
user_sys_privs 是最直接、最安全的方式查当前用户系统权限,不需要 dba 权限,也不依赖其他角色或视图嵌套。
为什么用 USER_SYS_PRIVS 而不是 DBA_SYS_PRIVS
因为 DBA_SYS_PRIVS 只对有 DBA 角色或 SELECT_CATALOG_ROLE 的用户开放;普通开发账号执行会报 ORA-00942: table or view does not exist。而 USER_SYS_PRIVS 是每个登录用户都能访问的视图,只返回「当前会话实际生效」的系统权限(包括直授的 + 通过角色继承来的)。
注意:USER_SYS_PRIVS 不显示 ADMIN_OPTION 列 —— 这意味着它不告诉你是否有「带 ADMIN 选项」的授权(比如能否再转授给他人),这点容易被忽略。
USER_SYS_PRIVS 返回字段含义和常见陷阱
该视图返回三列:PRIVILEGE(权限名)、ADMIN_OPTION(Oracle 11g 中此列恒为 NO,不可信)、COMMON(仅在 CDB 环境有意义,11g 单机库始终为 NO)。
- 真正可用的只有
PRIVILEGE字段,例如CREATE TABLE、UNLIMITED TABLESPACE - 如果查不到
CREATE SESSION,不代表不能连库 —— 它是连接时隐式授予的,不会出现在USER_SYS_PRIVS中 - 若用户通过角色获得权限(如
RESOURCE),USER_SYS_PRIVS仍会列出该角色所含的系统权限(如CREATE SEQUENCE),但不会注明来源是哪个角色
配合 SESSION_PRIVS 查看「此刻生效」的权限
SESSION_PRIVS 是更轻量的替代方案:它只返回当前会话已激活的系统权限(不含被 REVOKE 但未重连的残留项),且查询更快、无权限依赖。
执行:
SELECT * FROM SESSION_PRIVS;
- 结果与
USER_SYS_PRIVS高度重合,但更贴近真实运行时状态 - 不包含
ADMIN_OPTION或COMMON,结构更干净 - 如果你刚执行
SET ROLE切换角色,SESSION_PRIVS会立即反映变化,而USER_SYS_PRIVS不会
别漏掉角色间接带来的权限
USER_SYS_PRIVS 虽然会展开角色里的系统权限,但它不告诉你「哪些角色带来了哪些权限」。如果需要溯源,必须补查:
SELECT GRANTED_ROLE FROM USER_ROLE_PRIVS;
再对每个角色查:
SELECT PRIVILEGE FROM ROLE_SYS_PRIVS WHERE ROLE = 'RESOURCE';
- 典型组合如
CONNECT+RESOURCE,实际赋予了CREATE SESSION、CREATE TABLE、CREATE SEQUENCE等共约 15 项系统权限 - 如果发现某权限存在但不知道来源,先查
USER_ROLE_PRIVS,再逐个查ROLE_SYS_PRIVS,这是最稳的排查链
真正难的是判断权限是否「可传播」或「受限制」——USER_SYS_PRIVS 完全不提供这些上下文,得靠人工交叉核对角色定义和授权语句。

