我有以下表格:
users
- userid
- real name
- other stuff
roles
- roleid
- description
- other stuff
functions
- functionid
- description
screens
- screenid
- description
用户可以拥有多个角色,由表格
控制user_roles
- userid
- roleid
每个角色都可以编辑,查看或无法访问由表
控制的给定函数role_functions
- roleid
- functionid
- status
如果角色对该函数具有编辑权限,则 status
为'E';如果角色具有该函数的查看权限,则为'V',并且可以没有记录,或者具有'N'的记录如果角色没有该功能的权限,则为status。
最后,一个功能有多个屏幕,由表
控制function_screens
- functionid
- screenid
我知道,这是一个令人困惑的混乱,但角色,功能和屏幕的要求来自不同的业务部门,所以我无法简化它。但是,我需要的是一个查询,我可以给QA部门和给定用户ID的其他人,他们可以列出所有屏幕,以及他们是否具有编辑,查看或无权访问该屏幕。如果该用户属于一个角色,该角色为包含屏幕的功能提供“E”权限,而另一个角色授予他们对包含同一屏幕的功能的“V”权限,则他们对该屏幕的权限为“E” ”。
现在我正在使用一堆带有Maps of Maps的Java代码完成所有这些查找,但我想知道在SQL脚本中是否有更简单的方法。
答案 0 :(得分:4)
试试这个:
select s.screenid, s.description
, CASE MAX(CASE rf.status WHEN 'E' THEN 2 WHEN 'V' THEN 1 ELSE 0 END)
WHEN 2 THEN 'E'
WHEN 1 THEN 'V'
ELSE 'N' END as status
from user_roles ur
join role_functions rf on rf.roleid = ur.roleid
join function_screens fs on fs.functionid = rf.functionid
join screens s on s.screenid = fs.screenid
where ur.userid = :theuser
group by s.screenid, s.description
order by s.screenid
2个嵌套的案例将E,V和N转换为2,1和0并返回,以便MAX可用于获得“最高”状态。