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。