You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MariaDB中使用递归CTE查询任意嵌套层级角色关联用户方案

兼容MariaDB与低版本MySQL的递归CTE实现方案

问题根源

原有写法的兼容性问题来自作用域嵌套过深:旧版本MariaDB和MySQL 8.0早期版本,仅支持递归CTE读取直接父层的变量,将CTE放在两层EXISTS子查询内部时,CTE无法读取到第二层外层的roles.id字段,因此出现报错或者结果异常。

兼容方案

将递归逻辑前置,先一次性查询出所有属于目标角色继承链的角色ID,再关联用户关联表和用户表即可,完全避开多层作用域穿透的问题,同时性能更好,不需要每条关联记录都触发一次递归查询。

WITH RECURSIVE role_hierarchy AS (
    -- 锚点:定位目标角色
    SELECT id, name, parent_id 
    FROM roles 
    WHERE name = 'superuser' -- 此处修改为你要查询的目标角色名
    UNION ALL
    -- 递归向下遍历所有子角色(子角色默认继承父角色权限)
    SELECT r.id, r.name, r.parent_id
    FROM roles r
    INNER JOIN role_hierarchy rh ON r.parent_id = rh.id
)
-- 关联查询持有目标继承链内任意角色的用户
SELECT DISTINCT u.*
FROM users u
INNER JOIN user_roles ur ON u.id = ur.user_id
INNER JOIN role_hierarchy rh ON ur.role_id = rh.id;

方案说明

  • 兼容性:支持MariaDB 10.2+所有支持递归CTE的版本,同时兼容MySQL 8.0全版本,不会出现作用域相关报错
  • 扩展性:支持任意深度的角色嵌套,不需要硬编码关联层级
  • 验证结果:使用提供的测试数据运行,会返回符合预期的Alice、Bob两条用户记录,Charlie不在结果集内

内容的提问来源于stack exchange,提问作者vixducis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:18:00