观远 BI

各直连数据库行权限设置语法

创建于 2022-11-01 / 最近更新于 2023-04-06 / 3418
字体: [默认] [大] [更大]

注意事项

      5.5版本开始,行列权限条件模式下,新增“in(用户属性)”,单值或多值的用户属性可以直接和数据集字段匹配,建议优先使用条件模式下的“in(用户属性)”功能,条件模式无法满足需求时再使用自由模式。以下数据库函数写法仅供自由模式使用参考。

1. MySQL直连

FIND_IN_SET([督导id],[CURRENT_USER.督导ID])>0

参考函数注解:https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set

2. HANA直连

locate(concat([类别],','),concat([CURRENT_USER.类别],','))>0

3. SQL Server直连

-- 写法一:如果[CURRENT_USER.门店] 字段的长度不等,可以用这个:
CHARINDEX(','+[shopping_area]+',' , ','+[CURRENT_USER.所在省份]+',') > 0

-- 写法二:如果[CURRENT_USER.工号] 字段长度相等,不存在:当Member_Id为10,100,1000的情况的时候可以简写:
CHARINDEX(','+[Member_Id]+',', ','+[CURRENT_USER.工号]+',')>0

4. PostgreSQL直连

-- 写法一:
position([dept_name] in [CURRENT_USER.deptcode]) > 0

-- 写法二 (推荐写法):
cast([门店id] as varchar) = ANY(string_to_array([CURRENT_USER.门店],’,’))

5. Clickhouse直连

-- 写法一(适用于没有null的数据集):
has(splitByChar(',',[CURRENT_USER.所在地区1]),[省份])>0

-- 写法二(推荐写法):
has(cast(splitByChar(',',[CURRENT_USER.城市]),'Array(Nullable(String))'),[城市])>0

【说明】Clickhouse的数据类型检查非常严格,容易出现类型不匹配的情况。

1)引用数据集字段是有null值的会出现如下报错:Types of array and 2nd argument of function \"has\" must be identical up to nullability, cardinality, numeric types, or Enum and numeric type. Passed: Array(String) and Nullable(String)

报错信息在提示数组类型为String,而传入的参数是 Nullable(String),即引用数据集字段是有null值的,两者比较不匹配。要解决该问题,把用户属性也转换为Nullable(String)即可

has(cast(splitByChar(',',[CURRENT_USER.所在地区1]), 'Array(Nullable(String))') ,[省份])>0

2)如果行列权限使用的数据集字段非string(如下数据集的人员id字段是int类型),也可能会报错,那么对应的行列权限需要改成下面这样,保证数据格式的相同。

has(cast(splitByChar(',',[CURRENT_USER.id]),'Array(Nullable(Int32))'),[人员id])>0

6. Oracle直连

instr([CURRENT_USER.GID],[STORE_GID]) > 0

7. TiDB直连

FIND_IN_SET([督导id],[CURRENT_USER.督导ID])>0

8. Greenplum直连

[order_id] in (select unnest(string_to_array([CURRENT_USER.order_id],',')))

9. Doris数据库直连

find_in_set([机构大区],[CURRENT_USER.机构大区])>0

【说明】以Oracle直连为例,直接“> 0”这种写法可能会存在模糊查找的问题,如果要的是精确查找,这时候需要前后加特殊字符隔开,比如写成:instr(','||[CURRENT_USER.城市]||',' , ','||[城市]||',') > 0

10. 使用Impala直连

例如数据集「组织」字段范围:上海观远数据、观远数据、杭州观远数据;
用户属性「所属组织」选择:杭州观远数据
-- 写法一:存在模糊匹配的情况
instr([CURRENT_USER_USER:所属组织],[组织])>0
/*
返回匹配结果:观远数据、杭州观远数据
*/
-- 写法二:精确匹配
instr(','||[CURRENT_USER_USER:所属组织]||',',','||[组织]||',')>0
/*
返回匹配结果:杭州观远数据
*/
--写法三:精确匹配
find_in_set([组织],[CURRENT_USER_USER:所属组织])>0
/*
返回匹配结果:杭州观远数据
*/


2 人点赞过