【问题标题】:How to filter a dimension based on RLS applied to another dimension?如何根据应用于另一个维度的 RLS 过滤维度?
【发布时间】:2021-11-22 06:07:37
【问题描述】:

假设我有 2 个维度表和 1 个事实表。

昏暗用户

DimClients

昏暗公司

事实销售

所有的暗淡与从 1 -> M 侧流出的过滤器具有 1:M 关系。

假设我在 DimUser ([Username] = USERNAME()) 上配置了 RLS 过滤器,以便报表用户可以根据电子邮件地址查看自己的数据,因此用户可以在 DimUser 中看到自己的记录条目。因此,它也会自动过滤 FactSales,有效地用户将只能看到他的销售额。

但是,用户可以在切片器中查看所有客户和公司。我想在 DimClients 和 DimCompany 上设置过滤器,以便用户只能看到他进行销售的客户和公司。我怎样才能做到这一点?

例如:

  1. 如何将 RLS 应用于 DimClients 和 DimCompany,以便它仅根据应用于 DimUsers 表的动态过滤器 [Username] = USERNAME() 过滤出现在销售表中的那些 ClientId?

  2. 另一个选项是启用双向过滤,但不允许用于多个表。

【问题讨论】:

    标签: powerbi dax row-level-security


    【解决方案1】:

    您可以创建如下所示的度量:

    UserFlag =
    CONTAINSSTRING (
        CONCATENATEX ( FactSales, RELATED ( DimUsers[UserEmail] ), "," ),
        USERNAME()
    )
    

    创建您的 RLS 角色并将此过滤器添加到每个维度。

    [UserFlag] = True()
    

    结果:如果维度中的行与事实行相关,而事实行又与电子邮件与 USERNAME() 匹配的 DimUser 行相关,则度量返回“True”。所以 RLS 只过滤那些行。

    【讨论】:

    • 是否有任何理由将 rls 添加到事实表中?将它添加到维度表应该自动过滤事实表 - 不是吗?
    • 是的,你是对的。承认事实是矫枉过正
    • 另外,您是要创建计算字段还是度量?
    • 这绝对是一个措施。 USERNAME() 和 USERPRINCIPALNAME() 函数不能用于计算列。
    • 我正在考虑是否可以这样做:DimClients 的 rls 过滤器应该是 -> =clientid IN(基于 DimUser 表上的用户名过滤器的事实表中的 ClientIds 列表)。这个可以吗。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多