我有一个表,我正在尝试使用具有以下结构的辅助表来实现 RLS:
员工表
过滤表
员工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 表达式以将其转换为这样,但我无法使其按预期工作。
为了扩展 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
,并根据查看者在层次结构中的位置应用行级别安全性。