各直连数据库行权限设置语法
注意事项
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 /* 返回匹配结果:杭州观远数据 */