我一直在使用 radacad 创建的一些非常有用的文章(例如 https://radacad.com/dynamic-row-level-security-with-manager-level-access-in-power-bi),使我能够向我的 SSAS 数据模型添加一些行级安全性,该模型是 Power BI 仪表板的数据源。
本质上,这就是我希望行级安全性发挥作用的方式。
上面代表下面的每个If语句。
以下 DAX 几乎足够完美:
=
If(
MaxX(
Filter(
'Employee',
'Employee'[Email]=USERPRINCIPALNAME() )
,'Employee'[IsManager])="Yes"
&&
MaxX(
Filter(
'Employee',
'Employee'[Email]=USERPRINCIPALNAME() )
,'Employee'[Department])="LOD1"
,1=1
,
If(
MaxX(
Filter(
Employee,
[Email]=USERPRINCIPALNAME())
, Employee[IsManager])="Yes"
&&
MaxX(
Filter(
Employee,
[Email]=USERPRINCIPALNAME())
, Employee[Department]) <> "LOD1",
PATHCONTAINS(Employee[Department],
MaxX(
Filter(
Employee,
[Email]=USERPRINCIPALNAME())
, Employee[Department]
)),
[Email]=USERPRINCIPALNAME()))
但是,我在使用 MaxX 表达式时遇到了问题。这是因为在 Employee 表中,一名员工可以拥有多个行,因为一名员工可以拥有多个部门。因此,对于拥有多个部门的员工,Power BI 仪表板仅向他们显示所选最大部门的数据。
如果有人可以帮助我调整我的查询以适应这一障碍,并允许拥有多个部门的员工查看他们的所有部门,而不仅仅是最大部门,那就太好了。
谢谢
您可以使用
DISTINCT
或 VALUES
获取用户的部门列表,然后在过滤条件中执行 IN
。
尝试:
var isManagerLOD1 =
COUNTROWS(
FILTER(Employee,
'Employee'[Email]=USERPRINCIPALNAME() &&
'Employee'[IsManager] = "Yes" &&
'Employee'[Department] = "LOD1"
)
) > 0
var managerDepartments = CALCULATETABLE(
DISTINCT('Employee'[Department]),
FILTER(Employee,
'Employee'[Email] = USERPRINCIPALNAME() &&
'Employee'[IsManager] = "Yes"
)
)
var isManagerDepartment =
COUNTROWS(
FILTER(Employee,
'Employee'[Department] IN managerDepartments
)
) > 0
var isUser = [Email]=USERPRINCIPALNAME()
return isManagerLOD1 || isManagerDepartment || isUser