Power BI中如何将USERNAME()度量值与表列值比较实现用户动态过滤
Power BI 用户级数据权限过滤实现方案
M语言获取当前用户名的方法
M语言中可以通过User.Identity()函数获取当前访问用户的身份信息,提取用户名/UPN的用法为:
User.Identity()[Name]
注意事项:
- Power BI Desktop 本地调试时,该函数返回本地Windows账号名称
- 发布到Power BI服务后,返回用户的工作/学校账号UPN(格式为
xxx@企业域名.com),和DAX中USERNAME()函数的返回值完全一致 - 仅DirectQuery模式下适合用M做用户过滤,导入模式下M的逻辑仅在数据集刷新时执行,无法实现不同访问用户动态过滤,优先推荐用DAX+RLS方案
DAX使用USERNAME()比较报错的解决方案
你遇到的「无法将度量值与多个值进行比较」报错,核心原因是没有在逐行计算的上下文里执行比较逻辑,系统识别为你要将整个用户列的多个值和USERNAME()返回的单个标量值做对比,才触发错误。
标准实现方案(行级别安全性RLS)
这是Power BI实现用户动态数据过滤的官方推荐方案,无需修改数据查询逻辑,配置步骤如下:
- 确保
Person表包含用户UPN列(存储和USERNAME()返回格式一致的用户账号),且Person表和业务表通过「办事处ID」「区域ID」等字段建立了一对多关联,筛选方向为从Person表指向业务表 - 点击顶部菜单栏「建模」-「管理角色」,新建角色(例如命名为「普通访问用户」)
- 选中
Person表,在表筛选DAX输入框中填入:
[用户UPN列] = USERNAME()
- 保存角色后,可通过「建模」-「以角色身份查看」功能,输入测试用户的UPN验证过滤效果
- 发布到Power BI服务后,在对应数据集的「安全性」设置中,将需要访问报表的用户添加到「普通访问用户」角色即可
配置完成后,用户访问报表时,系统会自动用当前登录用户的UPN过滤Person表,筛选条件会通过关联关系自动传递到所有业务表,用户仅能看到自身所属办事处/区域的对应数据。
内容的提问来源于stack exchange,提问作者dougp
相关产品推荐
相关产品推荐

