组织架构从两级改成三级,华东大区下面多了 6 个城市组。大区负责人登录后只能看到直属于大区的 12 条数据,城市组下的 380 条一条都看不到,改之前是两级时正常。乍看像缓存或者权限的锅,追下去往往不是。

WITH RECURSIVE sub AS (
  SELECT id FROM dept WHERE id = 21
  UNION ALL SELECT d.id FROM dept d JOIN sub s ON d.parent_id = s.id
) SELECT id FROM sub;

追下去是这么回事:数据范围的 SQL 只取了当前部门 id 和它的直接子部门,没有继续往下递归。层级加深后孙子部门不在条件里,数据自然被过滤掉。

碰到「部门层级递归」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

具体做法是,用递归 CTE 或闭包表一次取全部下级部门 id;列表查询改成 in 子查询 不写死层级;部门调整后刷新一次闭包表 保证新增节点有路径。

验收就看一点,大区负责人列表 total 从 12 变成 392,城市组账号看到的仍是各自范围内的数据。

作者 9823189