【问题标题】:What are the best practices for advanced row-level security in SSAS tabular models?SSAS 表格模型中高级行级安全性的最佳实践是什么?
【发布时间】:2021-12-27 09:07:43
【问题描述】:

我目前正在建立销售领域的新数据模型。在我想要替换的旧数据模型中,我为每个用户设置了非常具体的行级安全设置:有时,可以使用“AND”过滤器来完成设置:

UserXY 应该可以访问所有中国销售玩具的客户

有时,它们被定义为“或”:

UserXYZ 应该可以访问来自欧洲的所有客户和所有食品

由于不同客户的访问权限不同,因此必须为每个用户创建一个或多个角色(如果权限是基于“AND”的,则必须创建额外的角色)。

将来,我们希望通过一个表来控制数据访问,其中定义了用户可以访问的各个对象。但我担心可能无法涵盖不同维度上的 AND/OR 逻辑。

当然,MS 也有关于动态 RLS 的概念 (https://docs.microsoft.com/en-us/power-bi/connect-data/desktop-tutorial-row-level-security-onprem-ssas-tabular)。但由于这只是一个维度,它并不能满足我们的要求。

有人曾经在数据模型中偶然发现过类似的问题吗?是否有任何最佳实践解决方案可以更好地处理表格模型中的单个 RLS 访问权限?

问候, 伊沃

【问题讨论】:

    标签: ssas data-modeling ssas-tabular row-level-security


    【解决方案1】:

    只要您有复杂的 RLS 要求,您的模型中就有一个简单的模式可供遵循。

    引入并填充表单 (UserName,DimensionKey) 的用户权利表,将过滤器流向目标维度(或者可能是 (GroupId, DimensionKey) )。

    所以

    UserXY 应该可以访问所有中国销售玩具的客户

    所以提前运行一个查询,计算“所有来自中国销售玩具的客户”,并将所有这些插入到 CustomerEntilement 表中

    insert into CustomerEntitlement (UserName, CustomerId)
    select 'UserXY', CustomerId
    from DimCustomer c
    join FactSales s 
      on s.CustomerID = c.CustomerID
    where s.ProductType = 'Toys'
    

    然后您只需在 CustomerEntitlement 上放置一个 RLS 过滤器。

    【讨论】:

    • 有趣。假设玩具是维度“DimProduct”的一个属性,并且我有不止一个事实表。然后我必须遍历所有用户和所有事实表并计算 DimCustomer 和 DimProduct 之间所有可能的匹配项,对吗?由于用户数量和事实表的大小,我担心无法在有用的时间内计算出来。
    • 如果你有大量的用户,通常可以将他们分组以减少组合的数量。事实表包含所有相关的维度组合。而且您实际上不应该“循环”任何东西。这只是一个带有一些连接的 SQL 查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2011-03-17
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    相关资源
    最近更新 更多