需求:
1.1001权限为:上海地区+全部品牌
2.1002权限为:A品牌+全部地区
3.1003权限为:北京地区+A品牌
4.1004权限为:上海地区+A品牌 && 北京地区+B品牌
如何设计权限表。sql怎么写
用户id用fine_username传递
利用finebi的内置权限配置,生成的sql如下
select * from table a
where
(
a.地区 in ('北京')
and a.品牌 in ('B')
)
or (
a.地区 in ('上海')
or后面的条件不是所有用户都需要,是动态的。麻烦在这里
权限表:id,地区权限,品牌权限,为空表示全部,1234分别是
SELECT * FROM (数据的查询) A LEFT JOIN 权限表 B ON A.地区=NVL(B.地区权限,A.地区) AND A.品牌=NVL(B.品牌权限,A.品牌)
WHERE 1=1
AND B.ID='${fine_username}'
===
你的语句里只包含了目标的权限,相当于手动去过滤了权限表,跟下图注释掉一样
确实会变得快,但是这能算优化吗?事先去过滤权限表也是要时间的,不然事先怎么知道怎么过滤权限表。
解释一下“+”号意思是:北京地区 且 A品牌还是北京地区 或者 A品牌
select
地区,
品牌,
销量
from(
select 地区,品牌,销量 from 业务表
'${fine_username}'='1001'
and 地区="上海"
union
'${fine_username}'='1002'
and 品牌='A'
'${fine_username}'='1003'
and 地区='北京'
'${fine_username}'='1004'
and (地区='上海' and 品牌='A')
or(地区='北京' and 品牌='B')