在配置数据集行权限时,经常会遇到一种比较“迷惑”的现象:公式可以保存,预览或卡片也不报错,但用户看到的数据却和预期不一致。有时是普通用户仍能看到全量数据,有时是不同账号看到的数据范围不一样,有时则是原本应该能看到的数据完全看不到。这类问题不建议一开始就判断为“产品没生效”或“公式没生效”。更高效的方式是把问题拆成几类可能性,逐步缩小范围: - 权限链路是否真的启用了?
- 当前测试账号是否被规则放行?
- 公式逻辑是否和账号属性匹配?
- 字段名、用户属性名是否写对?
- 自由模式公式是否符合当前数据源的 SQL 语法?
- 最终查询里是否真的追加了行权限过滤?
下面结合一个脱敏案例,总结一套可复用的排查方法。 一、先确认问题现象排查前,先不要急着改公式。建议先把问题现象描述清楚: - 是所有用户都看到全量数据,还是只有某些用户异常?
- 是完全看不到数据,还是看到的数据比预期多?
- 数据集是抽取数据集还是直连数据集?
- 是否使用了数据权限模板?
- 当前测试账号预期应该看到哪些数据?
- 实际看到的数据范围是什么?
例如,一个门店伙伴账号预期只能看到: store_code = S001
但实际在卡片中看到多个门店: S001
S002
S003
这类现象说明问题不是“完全无数据”,而是“过滤范围没有按预期收窄”。 再例如,一个大区或子公司职能账号预期只能看到: company_id in (C001, C002)
但实际看到其他子公司数据,则说明需要重点检查 company_id 分支是否命中、是否下推。 二、检查权限是否真的进入生效链路第一步先确认权限是否有机会生效。 需要检查: - 数据集行权限开关是否开启。
- 当前数据集是否已经调用了正确的数据权限模板。
- 如果启用了模板,当前数据集是否仍跟随模板,还是已经开启自定义编辑。
- 行权限规则是否关联到了当前测试用户或用户组。
- 是否存在“总是可见”类规则。
- 测试账号是否为数据集 Owner、管理员或具备管理权限的账号。
很多时候,测试人员用的是管理员账号、数据集所有者账号,或者拥有资源管理权限的账号。部分权限配置下,这类账号可能不会被行权限过滤。验证行权限效果时,建议优先使用普通只读账号。 还要注意,“账号属于某个用户组”只表示该账号可能匹配某条规则,不代表一定会命中公式里的某个用户属性条件。用户组、角色、职位、用户自定义属性是不同概念,不能混用。 三、按用户属性拆解公式分支复杂行权限公式通常由多个 OR 分支组成。排查时不要整体看公式,而是按账号属性逐段判断:这个账号到底会命中哪一段? 例如一个脱敏后的公式结构如下: (
[CURRENT_USER.人员类型] = '集团职能'
OR [CURRENT_USER.人员类型] = '外部对接'
)
OR (
[CURRENT_USER.人员类型] = '门店伙伴'
AND FIND_IN_SET([store_code], [CURRENT_USER.管理门店code]) > 0
)
OR (
[CURRENT_USER.人员类型] = '大区及子公司职能'
AND [CURRENT_USER.归属部门] LIKE '%教练%'
AND FIND_IN_SET([store_code], [CURRENT_USER.管理门店code]) > 0
)
OR (
[CURRENT_USER.人员类型] = '大区及子公司职能'
AND [CURRENT_USER.归属部门] NOT LIKE '%教练%'
AND FIND_IN_SET([company_id], [CURRENT_USER.归属子公司id]) > 0
)
这个公式可以拆成四类账号: | 人员类型 | 其他条件 | 应看到的数据 |
|---|
| 集团职能 / 外部对接 | 无 | 全量可见 | | 门店伙伴 | 管理门店 code 有值 | 只能看匹配的 store_code | | 大区及子公司职能 | 归属部门包含“教练” | 按 store_code 控制 | | 大区及子公司职能 | 归属部门不包含“教练”或为空 | 按 company_id 控制 |
如果一个账号的 人员类型 = 门店伙伴,管理门店code = S001,那么它应该只看到: store_code = S001
如果一个账号的 人员类型 = 大区及子公司职能,归属部门 不包含“教练”,归属子公司id = C001,C002,那么它应该只看到: company_id in (C001, C002)
如果一个账号的 人员类型 = 集团职能,那它看到全量数据并不是异常,而是公式本身放行。 四、核对字段和用户属性公式分支判断清楚后,继续核对字段和用户属性。 1. 用户属性名是否一致公式里写的是: [CURRENT_USER.人员类型]
那用户详情里必须真的存在“人员类型”这个用户属性,并且值要精确匹配,例如: 人员类型 = 门店伙伴
不能用“职位=店长”代替“人员类型=门店伙伴”,也不能用“用户组=店长”代替“人员类型=门店伙伴”。 常见误区: - 看到账号职位是“店长”,就认为会命中“门店伙伴”分支。
- 看到账号在“店长用户组”,就认为公式中的人员类型会自动等于“门店伙伴”。
- 实际上公式只读取
[CURRENT_USER.人员类型],不会自动读取职位或用户组。
2. 用户属性值是否为空如果公式里用了: [CURRENT_USER.管理门店code]
[CURRENT_USER.归属子公司id]
那就要确认对应账号这些属性是否有值。 例如门店伙伴账号: 人员类型 = 门店伙伴
管理门店code = S001
如果 管理门店code 为空,则门店分支不会匹配任何数据。 3. 多值分隔符是否符合公式预期很多用户属性是多值,例如: 管理门店code = S001,S002,S003
如果用户可能使用中文逗号、顿号、分号、空格等分隔符,公式需要先统一替换成英文逗号,例如: REGEXP_REPLACE([CURRENT_USER.管理门店code], '[,、;;|\\s]+', ',')
这样可以兼容: S001,S002
S001、S002
S001;S002
S001 S002
但如果实际值里混入了其他不可见字符、前后空格、大小写差异,也可能导致匹配失败。可以通过 LOWER、TRIM、统一分隔符等方式增强容错。 4. 数据集字段名或别名是否精确匹配公式里写的是: [store_code]
[company_id]
那数据集模型结构中需要存在同名字段或别名。 例如 SQL 中建议明确别名: select
store_code as store_code,
company_id as company_id
from table_name
如果模型字段实际叫: 门店编码
子公司ID
storeCode
companyId
而公式写的是 [store_code]、[company_id],就可能匹配不到字段或执行结果不符合预期。 五、用最小验证缩小范围复杂公式不要直接整段调试。建议用“三步最小验证法”。 第一步:用 1 = 0 判断权限链路是否生效临时把行权限公式改成: 1 = 0
然后用普通测试账号查看数据。 预期结果: - 如果看不到任何数据,说明行权限链路是生效的,问题在原公式逻辑。
- 如果仍能看到数据,说明权限没有进入查询链路,需要回到开关、模板、账号权限、规则关联范围继续排查。
这个步骤非常关键。它可以快速区分: 权限链路没生效
还是: 权限链路生效了,但原公式放行了数据
第二步:用单分支公式验证账号属性如果测试门店伙伴账号,可以临时只保留门店分支: [CURRENT_USER.人员类型] = '门店伙伴'
AND FIND_IN_SET(
LOWER(CONCAT([store_code], '')),
LOWER(REGEXP_REPLACE([CURRENT_USER.管理门店code], '[,、;;|\\s]+', ','))
) > 0
然后验证结果是否只包含该账号管理的门店。 如果测试大区或子公司职能账号,可以只保留子公司分支: [CURRENT_USER.人员类型] = '大区及子公司职能'
AND FIND_IN_SET(
LOWER(CONCAT([company_id], '')),
LOWER(REGEXP_REPLACE([CURRENT_USER.归属子公司id], '[,、;;|\\s]+', ','))
) > 0
这样可以避免多个 OR 分支互相干扰。 第三步:用明细表确认结果范围建议新建一个最简单的表格,不加任何页面筛选器,只放验证字段。 门店伙伴账号: 维度:store_code, store_name
指标:记录数 / sell_cnt
预期只出现该账号管理的门店 code。 大区或子公司职能账号: 维度:company_id, company_name
指标:记录数 / sell_cnt
预期只出现该账号归属子公司 id 列表中的公司。 不要一开始就在复杂页面、复杂卡片、多个筛选器叠加的场景里验证。先用最小表格确认数据权限范围,再回到正式页面验证。 六、结合 AI 工具提升排查效率AI 很适合辅助拆解复杂行权限公式。它不能替代真实环境验证,但可以显著减少人工理解公式和设计验证步骤的时间。 1. 让 AI 拆解公式分支可以把公式发给 AI,让它输出: - 一共有几个
OR 分支。 - 每个分支适用于哪类用户。
- 每个分支按哪个字段过滤。
- 每类账号预期能看到什么数据。
示例提示词: 请帮我拆解下面这段 BI 行权限公式。
要求:
1. 按 OR 分支逐段解释。
2. 说明每个分支适用于什么用户属性。
3. 说明每个分支最终按哪个数据集字段过滤。
4. 给出不同测试账号应该看到的数据范围。
公式如下:
【粘贴公式】
2. 让 AI 根据账号属性判断预期结果当拿到一个测试账号属性时,可以让 AI 判断这个账号应该命中哪一段。 示例提示词: 下面是一个测试账号的用户属性和一段行权限公式。
请判断该账号会命中哪个公式分支,并说明登录后应该看到哪些数据。
账号属性:
人员类型 = 门店伙伴
管理门店code = S001
归属部门 = 门店A
公式:
【粘贴公式】
请输出:
1. 命中的分支。
2. 应该按 store_code 还是 company_id 过滤。
3. 预期可见的数据范围。
4. 应该如何建表验证。
3. 让 AI 生成验证卡片字段可以让 AI 直接给出验证表格的字段设计: 请根据这个行权限公式,设计最小验证卡片。
要求:
1. 分别给出门店伙伴账号、大区子公司职能账号的验证字段。
2. 指出每类账号预期应该看到哪些字段值。
3. 不考虑页面筛选器,只验证数据集行权限。
4. 让 AI 帮忙排除常见原因当出现“保存成功、不报错、但不生效”时,可以让 AI 给出排查清单: 行权限公式可以保存,也不报错,但普通账号看到的数据范围不符合预期。
请按优先级列出排查步骤。
已知:
1. 行权限开关已开启。
2. 使用的是直连数据集自由模式。
3. 测试账号是普通只读账号。
4. 字段 store_code、company_id 存在。
5. 公式中使用 CURRENT_USER 用户属性。
请输出可执行的排查清单。
AI 输出后,还需要结合真实环境逐项验证。尤其是账号属性、字段名、最终可见数据范围,必须以实际系统为准。 七、匿名案例复盘下面用一个脱敏案例说明排查过程。 某直连数据集配置了行权限模板,公式逻辑大致如下: - 集团职能、外部对接:全量可见。
- 门店伙伴:按
store_code 匹配管理门店。 - 大区及子公司职能,且部门包含“教练”:按
store_code 匹配管理门店。 - 大区及子公司职能,且部门不包含“教练”:按
company_id 匹配归属子公司。
账号 A:门店伙伴账号属性: 人员类型 = 门店伙伴
管理门店code = S001
命中分支: 门店伙伴 + store_code 匹配
预期结果: 只能看到 store_code = S001 的数据
验证方式: 维度:store_code, store_name
指标:记录数
如果结果中出现 S002、S003 等其他门店 code,说明不符合预期。 账号 B:大区及子公司职能账号属性: 人员类型 = 大区及子公司职能
归属部门 = 子公司数分
归属子公司id = C001,C002,C003
管理门店code = 空
命中分支: 大区及子公司职能 + 归属部门不包含“教练” + company_id 匹配
预期结果: 只能看到 company_id in (C001, C002, C003) 的数据
验证方式: 维度:company_id, company_name
指标:记录数
如果出现 C004 或其他未授权公司,说明不符合预期。 本案例中的排查顺序- 先确认行权限开关和模板调用状态。
- 确认测试账号为普通账号,不是 Owner/Admin。
- 确认公式字段
store_code、company_id 在数据集模型中存在。 - 确认未配置“字段不匹配时忽略规则”。
- 按账号属性拆解公式分支。
- 对门店伙伴账号,用
store_code 明细表验证。 - 对大区及子公司职能账号,用
company_id 明细表验证。 - 如果结果仍不符合预期,再用
1=0 判断权限链路是否真正生效。
这个过程的关键不是反复改公式,而是先判断“这个账号理论上应该走哪条分支”。 一页式排查清单遇到行权限公式不生效或结果不符合预期时,可以按下面顺序检查: 1. 确认现象
- 是全量可见、部分异常、完全不可见,还是不同账号不一致?
- 当前账号预期能看到哪些 store_code / company_id?
2. 确认权限链路
- 行权限是否开启?
- 是否调用了正确模板?
- 规则是否关联到当前用户或用户组?
- 是否存在“总是可见”规则?
- 测试账号是否为普通账号?
3. 拆解公式分支
- 公式有几个 OR 分支?
- 当前账号命中哪一段?
- 该分支按 store_code 还是 company_id 控制?
4. 核对用户属性
- 人员类型是否有值?
- 管理门店code 是否有值?
- 归属子公司id 是否有值?
- 归属部门是否影响分支判断?
- 用户属性名是否和公式完全一致?
5. 核对数据集字段
- store_code 是否存在?
- company_id 是否存在?
- 字段名或别名是否和公式完全一致?
6. 做最小验证
- 用 1=0 测权限链路。
- 用单分支公式测账号属性。
- 用 store_code/company_id 明细表看结果范围。
7. 排查 SQL 方言
- 直连数据集自由模式是否符合源库 SQL 语法?
- FIND_IN_SET、REGEXP_REPLACE、LOWER、CONCAT 是否被当前数据库支持?
- 多值分隔符是否统一成英文逗号?
可直接复制给 AI 的提示词模板模板一:拆公式请帮我分析下面这段 BI 行权限公式。
要求:
1. 按 OR 分支拆解。
2. 说明每个分支适用的用户属性条件。
3. 说明每个分支最终按哪个数据集字段过滤。
4. 给出每类账号应该如何验证是否生效。
5. 指出可能导致“保存成功但结果不符合预期”的原因。
公式如下:
【粘贴公式】
模板二:判断单个账号预期结果下面是一个测试账号的用户属性和一段行权限公式。
请判断该账号登录后理论上应该看到哪些数据。
账号属性:
人员类型 = 【填写】
归属部门 = 【填写】
管理门店code = 【填写】
归属子公司id = 【填写】
公式:
【粘贴公式】
请输出:
1. 命中的公式分支。
2. 应按 store_code 还是 company_id 过滤。
3. 预期可见值范围。
4. 应该用哪些字段建表验证。
模板三:生成排查清单行权限公式保存成功且不报错,但测试账号看到的数据和预期不一致。
请根据以下信息生成排查清单。
已知信息:
- 数据集类型:【抽取 / 直连】
- 数据库类型:【填写】
- 是否使用模板:【是 / 否】
- 行权限开关:【开 / 关】
- 测试账号是否普通账号:【是 / 否】
- 公式字段:【例如 store_code, company_id】
- 用户属性:【例如 人员类型、管理门店code、归属子公司id】
请按优先级输出排查步骤,并说明每一步如何判断结果。
总结行权限公式排查的核心,是不要把所有问题都归为“公式不生效”。很多时候,真正的问题是: - 当前账号命中了全量可见分支。
- 当前账号的用户属性和公式条件不一致。
- 用职位、用户组误代替了用户属性。
- 多值属性格式不符合公式预期。
- 字段名或别名与公式字段不一致。
- 直连数据集自由模式使用了不适配源库的 SQL 函数。
- 复杂页面叠加了其他筛选条件,干扰了判断。
推荐的排查策略是: 先验证权限链路,再拆公式分支;
先看账号属性,再看数据字段;
先做最小验证,再回到复杂页面。
配合 AI 工具,可以快速完成公式拆解、账号分支判断、验证字段设计和排查清单生成,把原本依赖经验的排查过程变成标准化步骤。 |