如何基于UserName函数筛选特定维度的可用成员
实现方案
你需要的是仅限制指定维度的成员可见性、不关联过滤事实数据的逻辑,不需要使用行级角色安全,有两种常用落地方式:
方案1:配置用户维度动态默认成员(无侵入,推荐)
该方案不需要修改任何查询代码,立方体层面配置后对所有前端浏览场景生效:
- 打开SSAS多维项目中对应的用户维度编辑器,选中
UserName属性 - 在属性面板的「DefaultMember」项中填入如下MDX表达式:
StrToMember("[你的用户维度名称].[UserName].&[" + UserName() + "]", CONSTRAINED)
UserName()是MDX内置函数,会自动返回当前会话登录的账号名称,CONSTRAINED参数用于避免动态成员构造的注入风险。
- 配置生效后,用户浏览立方体时,用户维度默认只会选中当前登录账号对应的成员,完全不会过滤其他维度关联的事实数据。如果需要禁止用户切换到其他用户成员,只需补充配置维度属性的可见成员规则即可,该操作不会影响事实数据的可见范围。
方案2:查询层嵌入筛选逻辑(适合自定义报表/临时查询场景)
如果只需要在特定查询/报表中实现该逻辑,直接在MDX查询中限制用户维度的查询范围即可,示例代码如下:
WITH -- 动态匹配当前登录用户对应的维度成员 SET CurrentUser AS StrToSet("[你的用户维度名称].[UserName].&[" + UserName() + "]", CONSTRAINED) SELECT {[Measures].[你需要查询的度量值]} ON 0, {[其他维度].[需要展示的层级].Members} ON 1 FROM ( SELECT CurrentUser ON 0 FROM [你的立方体名称] )
- 该方式仅对本次查询生效,不会改动立方体全局配置,也不会过滤其他维度对应的事实数据。
注意事项
- 如果你的
UserName属性存储的是不带域名的账号,而UserName()返回格式为域名\账号,可以用Replace函数去掉域名前缀后再匹配,示例:StrToMember("[用户维度].[UserName].&[" + Replace(UserName(), "你的域名前缀\", "") + "]", CONSTRAINED) - 如果需要完全隐藏其他用户的维度成员,只需在角色配置中给该用户维度的
UserName属性配置可见成员为上述动态表达式即可,该配置仅限制维度成员的可见性,和会过滤事实行的行级安全是完全独立的功能,只要不配置行级安全规则,就不会出现事实数据被过滤的问题。
内容的提问来源于stack exchange,提问作者Ian Wells
相关产品推荐
相关产品推荐

