You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:57:03