Oracle数据库:查询用户权限并输出true/false格式结果
解决方案
要实现每个用户对应所有权限的权限名=true/false格式输出,核心是先生成用户与所有权限的完整组合,再判断用户是否拥有对应权限,最后拼接结果:
SELECT u.login, LISTAGG( r.name || '=' || CASE WHEN ur.user_id IS NOT NULL THEN 'true' ELSE 'false' END, ';' ) WITHIN GROUP (ORDER BY r.id) AS UserRights FROM Users u CROSS JOIN Rights r LEFT JOIN UserRights ur ON u.id = ur.user_id AND r.id = ur.right_id GROUP BY u.login ORDER BY u.login;
逻辑说明
- CROSS JOIN Rights r:生成每个用户与系统所有权限的笛卡尔积,确保不会遗漏用户未拥有的权限项。
- LEFT JOIN UserRights:关联用户权限关联表,通过
ur.user_id IS NOT NULL判断用户是否持有当前权限,用CASE WHEN输出对应的true/false状态。 - LISTAGG:将每个用户的所有权限状态按权限ID排序后,用分号拼接成指定格式的字符串。
预期输出
针对你提供的测试数据,执行后会得到如下结果:
| LOGIN | UserRights |
|---|---|
| test1 | read=true;write=false |
| test2 | read=true;write=true |
内容的提问来源于stack exchange,提问作者Alexander Volkov
相关产品推荐
相关产品推荐

