DAX RLS 函数使用 LOOKUPVALUE 解析但不起作用

问题描述 投票:0回答:1

我有一个表,我正在尝试使用具有以下结构的辅助表来实现 RLS:

员工表

员工ID 员工邮箱
1 [电子邮件受保护]
2 [电子邮件受保护]

过滤表

员工ID 经理层次结构
1 3&4&5
2 6&7&4&5

ManagerHierarchy 列是一个字符串,显示员工的所有经理,这些经理连接在一起并用“&”分隔。

RLS 的目标是创建一个过滤器,允许任何经理查看报告并使其数据仅显示员工 ID,其中他们自己的 ID 存在于 ManagerHierarchy 列中,因此仅显示其下属。

我在 EmployeeTable 上应用了以下 DAX 表达式,我认为它可以在表达式生成器中工作并解析,但它给了我错误:

[EmplID]=
LOOKUPVALUE(
FilterTable[EmployeeID], FilterTable[ManagerHIERARCHY],

LOOKUPVALUE( //This is to return the viewer's own employeeID to be crossed over into the FilterTable
[EmployeeID], [EmployeeEmail], USERPRINCIPALNAME())
)

其给出的报告如下:

在评估 EmployeeTable 上定义的行级别安全性时遇到错误。函数“LOOKUPVALUE”不支持具有整数类型值的文本类型值。考虑使用 VALUE 或 FORMAT 函数来转换其中一个值。

我已经尝试重新洗牌我的 DAX 表达式以将其转换为这样,但我无法使其按预期工作。

powerbi dax row-level-security
1个回答
0
投票

为了扩展 David 的观察,在您的情况下,

ManagerHierarchy
是一个串联的 ID 字符串,它与直接查找
EmployeeID
不直接兼容。
LOOKUPVALUE
函数
旨在查找列中另一列与给定值匹配的值。

尝试在

EmployeeID
字符串中查找时,请确保将
EmployeeTable
中的
ManagerHierarchy
视为字符串。并根据查看者的
EmployeeTable
是否出现在
EmployeeID
内的任何
ManagerHierarchy
中来更正过滤
FilterTable
的逻辑。

// Define a variable to store the current viewer's EmployeeID as text
VAR CurrentViewerEmployeeIDAsText = 
    FORMAT(
        LOOKUPVALUE(
            EmployeeTable[EmployeeID], 
            EmployeeTable[EmployeeEmail], 
            USERPRINCIPALNAME()
        ),
        "General Number"
    )

// Filter expression to apply on the EmployeeTable
EmployeeTableFilter = 
FILTER(
    EmployeeTable,
    CONTAINSROW(
        FILTER(
            FilterTable,
            CONTAINSSTRING(
                FilterTable[ManagerHierarchy],
                CurrentViewerEmployeeIDAsText
            )
        ),
        EmployeeTable[EmployeeID]
    )
)

它检索查看者的

EmployeeID
并将其转换为字符串以与
ManagerHierarchy
匹配。
然后,它根据
EmployeeTable
是否出现在
EmployeeID
中的任何
ManagerHierarchy
中来过滤
FilterTable
,并根据查看者在层次结构中的位置应用行级别安全性。

© www.soinside.com 2019 - 2024. All rights reserved.