[英]Slow SSAS RLS implementation with DAX
我已经发布了 my.pbix,效果很好,速度也不错。 我从 SSAS 消费。 现在,我已经引入了一些 RLS 安全措施,对于访问权限有限的人来说,速度非常慢……
我该如何解决这个问题?
我有3个角色。
角色 1:(每个人都可以访问):
远程学习系统
员工表: =[NT Username] = USERNAME()
项目表:
=[Key_Project] IN
SELECTCOLUMNS(
FILTER(
'Engagement Role'
,'Engagement Role'[UserName] = USERNAME()
)
,"Key_project"
,'Engagement Role'[Key_project])
角色 2:(每个人都可以访问):
员工表:
=[TeamLeadEmployeeID] IN
SELECTCOLUMNS(
FILTER(
'Employee Current'
,'Employee Current'[NT UserName] = USERNAME()
)
,"RLS_Ids"
,[Employee Number])
项目表:
= VAR MyEmployeeNumber=
SELECTCOLUMNS(
FILTER(
'Employee Current'
,'Employee Current'[NT Username]=USERNAME()
)
,"EmployeeNumber"
,'Employee Current'[Employee Number]
)
VAR My_Employees =
SELECTCOLUMNS(
FILTER(
'Employee Current'
,'Employee Current'[TeamLeadEmployeeID] = MyEmployeeNumber
) ,"EmployeeNumber"
,'Employee Current'[Employee Number]
)
RETURN
[Key_project] IN
SELECTCOLUMNS(
FILTER(
'Engagement Role'
,'Engagement Role'[Employee Number] IN My_Employees
)
,"Key_project"
,'Engagement Role'[Key_project]
)
(第三个角色并不重要,它没有过滤器是读取所有访问权限)。
如果可以避免,您不想以这种方式设置安全性。 以您的第一个示例为例——安全过滤器遍历“项目”表的每一行,因此它为表的每一行计算 SELECTEDCOLUMNS。 根据这些表的大小,这可能需要做很多额外的工作,并且完全回避了柱状 model 的优势。
您想要过滤实际上具有与其中的 USERNAME() 匹配的值的表,然后让该过滤器沿着现有关系在整个 model 中传播。
因此,对于 Role1,您不会为“项目”表构建 RLS 过滤器,您只会在“参与角色”上放置一个过滤器,它看起来就像是 [UserName] = USERNAME()
[Key_Projects] 上的“参与角色”和“项目”之间还需要存在关系。 关系的筛选方向应为 go,从“参与角色”到“项目”。
我认为您会发现它的性能要高得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.