背景
公司做的教育方面的管理系统权限是按照 省管理员-市管理员-校管理员 的层次来规划的。
由于系统早期开发局限性,对于 所有管理员查看学生列表,是能直接看到所有学校的所有学生信息的。
这很明显不符合权限规范,因此本次版本更新推出新需求:
- 省管理员能看到本省的学生
- 市管理员能看到本市的学生
- 校管理员只能看到本校的学生
解决方案
既然要根据权限判断能查询到的学生,那么在进行查询语句之前,先获取该管理员能管理的学校,再将学校id作为一个list,放入查询学生的in条件中,即可实现需求。
那么现在的重点就在于,如何获取管理员能管理的学校,且,不能更改原接口的任何参数和返回参数。
公司的所有请求的请求头都会携带当前操作用户的 机构id 和 机构类型。
机构是树状结构,机构在数据库表中用有父机构id,机构类型包含:学校、市教育局、省教育局。
因此,可以根据机构类型来决定是否要查找该用户的机构的附属机构。
机构的概念与学校对应,这便是获取用户管理的学校步骤。
因此现在的问题在于,如何查询机构以及机构的附属机构。
这边需要通过SQL的递归语句了。
递归查询简述
WITH RECURSIVE recursive_query_name (col1, col2, ..., coln) AS (
-- 递归部分
SELECT
initial_query_result_col1,
initial_query_result_col2,
...,
initial_query_result_coln
FROM initial_query
UNION ALL
SELECT
recursive_query_result_col1,
recursive_query_result_col2,
...,
recursive_query_result_coln
FROM recursive_query_name, recursive_query
WHERE recursive_query_condition
)
-- 终止条件部分
SELECT * FROM recursive_query_name ;