如何通过USER_SYS_PRIVS视图查询Oracle 11g中当前用户的所有系统权限?

2026-04-30 21:261阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计830个文字,预计阅读时间需要4分钟。

如何通过USER_SYS_PRIVS视图查询Oracle 11g中当前用户的所有系统权限?

相关专题内容摘要:

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 TABLEUNLIMITED 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_OPTIONCOMMON,结构更干净
  • 如果你刚执行 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 SESSIONCREATE TABLECREATE SEQUENCE 等共约 15 项系统权限
  • 如果发现某权限存在但不知道来源,先查 USER_ROLE_PRIVS,再逐个查 ROLE_SYS_PRIVS,这是最稳的排查链

真正难的是判断权限是否「可传播」或「受限制」——USER_SYS_PRIVS 完全不提供这些上下文,得靠人工交叉核对角色定义和授权语句。

标签:Oracle

本文共计830个文字,预计阅读时间需要4分钟。

如何通过USER_SYS_PRIVS视图查询Oracle 11g中当前用户的所有系统权限?

相关专题内容摘要:

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 TABLEUNLIMITED 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_OPTIONCOMMON,结构更干净
  • 如果你刚执行 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 SESSIONCREATE TABLECREATE SEQUENCE 等共约 15 项系统权限
  • 如果发现某权限存在但不知道来源,先查 USER_ROLE_PRIVS,再逐个查 ROLE_SYS_PRIVS,这是最稳的排查链

真正难的是判断权限是否「可传播」或「受限制」——USER_SYS_PRIVS 完全不提供这些上下文,得靠人工交叉核对角色定义和授权语句。

标签:Oracle