Oracle 11g怎么查询角色的包含关系_利用ROLE_ROLE_PRIVS递归查询

阿辰姑娘_9835

阿辰姑娘_9835

2026-05-13

361人浏览

原创

因为role_role_privs仅记录角色间授予关系(如r1→r2),不关联用户;查用户完整角色链需联合dba_role_privs与role_role_privs,用start with...connect by递归查询,并注意grantee/granted_role语义对齐及default_role状态。

为什么只查 role_role_privs 查不出用户实际拥有的嵌套角色

因为 role_role_privs 只存角色之间的授予关系(比如 r1 → r2),完全不涉及用户。它像一张“角色关系图”,但没有起点——你不知道哪个用户站在图的哪个入口。常见错误是:看到 select * from role_role_privs where role = 'r1' 返回了 r2,就以为用户自动有了 r2;其实前提是该用户必须先被直接授予了 r1,否则这条链根本走不通。

怎么从用户出发查完整角色链(Oracle 11g 兼容写法)

Oracle 11g 不支持 WITH RECURSIVE,必须用 START WITH ... CONNECT BY。关键不是查 ROLE_ROLE_PRIVS 本身,而是把它和 DBA_ROLE_PRIVS 联合起来构建递归路径:

  • START WITH 从用户开始:找所有 grantee = 'USER_A' 的直接角色
  • CONNECT BY PRIOR granted_role = grantee 表示“上一层授出的角色,是下一层的被授方”,这样才能顺着 R1 → R2 → R3 往下钻
  • 必须加 DISTINCT,否则多条路径(如 R1→R3 和 R2→R3)会让 R3 重复出现
  • 漏掉 NOCYCLE 在测试环境容易触发 ORA-01436: CONNECT BY loop in user data,尤其当存在 R1→R2→R1 这类循环授权时

实操语句:

SELECT DISTINCT granted_role
FROM (
  SELECT grantee, granted_role FROM DBA_ROLE_PRIVS
  UNION ALL
  SELECT role AS grantee, granted_role FROM ROLE_ROLE_PRIVS
)
START WITH grantee = 'USER_A'
CONNECT BY NOCYCLE PRIOR granted_role = grantee;

ROLE_ROLE_PRIVS 和 DBA_ROLE_PRIVS 字段含义别搞反

两张表的 grantee 和 granted_role 方向一致,但语义不同:

QuantOracle
QuantOracle

63个确定性量化金融计算器 + 10个通过MCP的复合工作流。期权定价、Greeks、奇异衍生品、风险指标、投资组合优化……

下载
  • 在 DBA_ROLE_PRIVS 中:grantee 是用户或角色名,granted_role 是被授予的角色名(即用户 A 被授了角色 R)
  • 在 ROLE_ROLE_PRIVS 中:grantee 是角色名,granted_role 是被授出的角色名(即角色 R1 被授了角色 R2)
  • 所以合并查询时,要把 ROLE_ROLE_PRIVS.role 当作 grantee,才能对齐递归逻辑

误把 ROLE_ROLE_PRIVS.granted_role 当起点,会导致递归方向全错,查出来的是“谁有这个角色”,而不是“这个用户能走到哪些角色”。

查到角色后,怎么确认它到底含哪些权限

查出用户可达的所有角色只是第一步。每个角色还可能包含系统权限(查 DBA_SYS_PRIVS)和对象权限(查 DBA_TAB_PRIVS)。注意:

  • DBA_SYS_PRIVS.grantee 字段填的是角色名,不是用户名;所以得用上一步查出的角色列表做 IN 或 JOIN
  • 不要用 ROLE_SYS_PRIVS 替代 DBA_SYS_PRIVS —— 前者只对当前会话生效,且不含管理员显式授予的权限
  • 如果角色被授予了 WITH ADMIN OPTION,它还能再授给别人,但这不影响当前用户的权限集合,只是管理能力

最易忽略的一点:角色是否为 DEFAULT_ROLE。即使查到了某个角色,如果它在 DBA_ROLE_PRIVS 里 DEFAULT_ROLE = 'NO',且用户没在会话中显式 SET ROLE,那这个角色的权限在当前连接里实际是不可用的。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

oracle

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3009

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2268

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1200

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1158

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1336

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2098

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

3320

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

14875

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程