3

TL;DR:当LOOKUPVALUE()针对具有行级别安全性的表使用时,不应用 RLS 并且可以看到所有值

我需要根据用户在 Power BI 报告中选择一个“默认”值(位置)。

我正在针对 Azure 分析服务(表格模型 1400)进行报告

似乎在 Power BI 中实现默认值的方法是将值动态重命名为静态值,然后选择该静态值作为过滤器。

所以

  • 用户Bob有默认位置Location1,所以当他登录时,他应该看到他的位置
  • 用户Joe具有默认位置Location2,因此应在此位置上过滤他

诀窍是,他们可以选择选择另一个位置,看看他们是否喜欢

我尝试的第一件事是USERPRINCIPALNAME()直接在行级表达式上使用,但我得到了

...计算表/列中不支持 USERNAME 和 USERPRINCIPALNAME 函数。这些函数只能用于度量或 AllowedRowsExpression

所以接下来我想我会将 RLS 应用到不同的表中,然后进行查找,如下所示:

我有一个从名为的数据库加载的表Location,其中列出了所有位置。

我有一个名为 的独立表MyLocation,它是Location. MyLocation使用此 DAX 生成:

=SUMMARIZE(Location,Location[LocationKey],Location[Location Name])

(注意我也尝试过基于数据的表格,而不是基于 DAX 的表格)

MyLocation还具有像这样应用的动态行级安全性:

=(
  [LocationKey]
  =
  LOOKUPVALUE(
      'Employee[LocationKey],
      'Employee'[UserPrincipalName],
      USERPRINCIPALNAME())
  )

当我MyLocation在 Power BI 中查看时,我可以看到应用了 RLS - 只能看到一个位置。这与Location我可以看到所有位置(没有定义 RLS)形成对比

接下来,我在其中添加了一个列(行级表达式)Location并选择使用行级安全性评估的这个“单一”位置:

=LOOKUPVALUE(
    'MyLocation'[Location Name],
    'MyLocation'[LocationKey],
    'Location'[LocationKey]
)

它在 LocationKey 上匹配,但对于已通过 RLS 删除的记录,应该没有匹配项。

但是,当我测试最后一列时,RLS 被忽略了,所有位置都通过了。

我可以在 Power BI 中看到我面前的两张表:

MyLocation看起来像这样:(应用了 RLS)

Location       
==========================
Location 3      Location 3

位置如下所示:(未应用 RLS,但为什么其他位置不是空白?)

Location       LookupValue            
==========================
Location 1      Location 1
Location 2      Location 2
Location 3      Location 3
Location 4      Location 4
Location 5      Location 5
...........
....

我希望位置看起来像这样:

Location       LookupValue            
==========================
Location 1      blank
Location 2      blank
Location 3      Location 3
Location 4      blank
Location 5      blank
...........
....

因此,无论您使用什么技巧,您似乎都不能连续使用 USERPRINCIPALNAME() 。

我也尝试过将其定义USERPRINCIPALNAME()为度量并使用它,但这也失败了(现在不记得错误,但我也会重试)

我还尝试使用“独立参数”表来打开和关闭 RLS,SELECTEDVALUE但参数表中的过滤值永远不会出现。ISFILTERED尽管该表已被过滤,但始终返回 false。

4

3 回答 3

1

据我了解, Lookup[LookupValue] 是一列(不是度量),使用您的第三个代码片段:“=LOOKUPVALUE(...”

当您刷新模型时,计算列的结果会具体化。它们不受在查询时应用的 RLS 的影响,就在计算度量之前。

这不是特定于 LOOKUPVALUE 函数的。

于 2018-03-12T09:23:21.113 回答
1

我明白你现在的意思了。LOOKUPVALUE似乎对您的表具有未经过滤的访问权限,绕过了 RLS。我建议将此作为错误报告给 Microsoft。

在您的报告中,我建议使用这种形式的措施:

Measure =
VAR EmployeeLocation =
        LOOKUPVALUE(Employee[LocationKey],
                    Employee[UserPrincipalName],
                     USERPRINCIPALNAME())
RETURN IF(ISFILTERED(Location[Location]),
           <expression>,
           CALCULATE(<expression>,
               FILTER(Location, Location[LocationKey] = EmployeeLocation)))

这样,它应该默认计算未过滤EmployeeLocationLocation的值,否则将正常运行。

于 2018-03-06T02:59:38.737 回答
1

到目前为止,这对我有用:

目标是让给定用户自动看到他们自己的位置,但可以选择查看其他位置。

我尝试了很多事情,但最终我只是在事实表上创建了直接引用的单独度量USERPRINCIPALNAME

即,这显示了针对用户位置的位置总单位,而针对其他所有内容显示为零。

    My Location Units:= 
        CALCULATE(
            SUM([Units]),
            FILTER(
                'Location',
                'Location'[LocationKey]=
                LOOKUPVALUE(
                    'Employee'[LocationKey],
                    'Employee'[UserPrincipalName],
                    USERPRINCIPALNAME()
                )
            )
        )

然后我想:我不能只在一个维度上使用它吗?

Is My Location:= 
    CALCULATE(
    IF(ISBLANK(MAX('Location'[LocationKey])),"No","Yes"),
    FILTER(
        'Location',
        'Location'[LocationKey]=
        LOOKUPVALUE(
            'Employee'[LocationKey],
            'Employee'[UserPrincipalName],
            USERPRINCIPALNAME()
        )
    )
)

尽管我需要在行级别使用它,但它似乎可以工作,即使它是一种度量。

它用CALCULATE(<expression>,FILTER(<table>,<expression>))

FILTER部分进行用户级别过滤

表达式部分将其变为 YES/NO

如果需要,我可以使用它在 Power BI 中进行筛选并仅选择当前用户的位置。

我怀疑所有这些表达式都禁止写得更简单。随意启发我

我仍然不知道为什么LOOKUPVALUE不尊重RLS。我想知道它是否有,但我做错了什么,或者是否没有。

于 2018-03-04T12:05:59.733 回答