在第1部分在本系列中,我们讨论了Power BI中的行级安全性,它不同于SQL Server 2016中的RLS,然后继续演示了两个简单的场景,在这两个场景中,RLS可以使用一些DAX过滤器表达式在基于角色分配的模型中过滤数据。我们介绍了用户名()并证明了其实用性。在这第二篇文章中,我们将更深入地研究RLS。
第1部分的前两种情景并不是糟糕的实施。一行DAX表达式,您已覆盖了一个简单的过滤器。但生活很少曾经向我们递给我们一种如此削减和干燥的场景。对于这种情况,我们将增加一些要求,这些要求可能会被商业用户交出,例如:
为此,我们将再次回到数据库,创建一些表来帮助我们。我们已经有了Country表,所以不需要在那里做任何事情。但我们会再加四个:
T-SQL代码可以在附件中找到,一个简单的数据库图显示在这里:
我们还将通过基本的INSERT语句向各自的表添加一些行:
对于那些像我一样完全是SQL书呆子的人来说,我已经包括了可以在数据库中执行的CREATE TABLE、INSERT INTO和CREATE VIEW脚本。但是我们不需要将所有四个额外的表导入到模型中,我们只需要用户和每个用户都可以访问的国家的不同列表。这在[dbo]中表示。[SecurityQuery]视图(脚本#05)。如果你看一下视图定义,注意不同的关键字在SELECT子句中,可选字段显示用户的姓名和国家名称,没有任何字段(组)或(GroupUser)表,和底部的WHERE子句,过滤器只活动记录。
首先,我们需要从模型中删除Continent表,然后导入SecurityQuery数据集。因为这不是关于如何导入数据的练习,所以我将把它留给您来完成。在添加它的同时,还可以添加[SecurityReference]视图,我们将在本文的最后介绍它的用法。
一旦你在你的模型中有了[SecurityQuery],它需要在国家代码上连接到Country表:
提示:如果在安全查询数据集中有足够的行,当您在安全查询表中设置[国家代码]和[国家代码]之间的关系时,Power BI将识别出这是一个 -与国家桌子的许多关系处于“一个”方面。
如前所述,我们将使用“建模”选项卡上的“管理角色”按钮配置角色的DAX过滤器。我们将从之前从我们从之前学到的东西开始:[用户名]字段上的过滤器,并使用用户名()DAX函数如前所述:
但是,如果我们现在浏览模型,寻找集合中的任何一个成员,我们将看到他或她在Security Query返回的行中受到限制,而不是在Country表返回的行中受到限制。为什么不呢?前工作。这是因为应用USERNAME()筛选器的表不在层次结构的顶部,而是在底部。更复杂的是,从该层次结构的顶部有两个分支,一个分支通过国家表到销售,另一个分支直接到安全表。如果有一种方法可以根据Security Query表中列出的国家过滤该表中的国家就好了。我们需要更多的东西。
进入包含()DAX指数函数。MDSN的描述如下:
句法
包含(<表>,< columnName >, <价值> [,< columnName >, <价值>]…)
返回值
的值<英石rong>真正的如果每个指定的价值可以在相应的情况下找到columnName,或包含在这些列中;否则,函数返回<英石rong>假。
如果你是我的话,你会读到那个并思考,“说什么?”让我们首先实施,然后我们将解决并解释如何使用参数。返回底层管理角色,将Filter添加到Country表中,如下所示(提示:选择哪个列并不重要,因为你将用下面的整个文本替换它):
包含(
“SecurityQuery”,
“SecurityQuery”【用户名】,
用户名(),
“SecurityQuery”(CountryCode),
“国家”[CountryCode])
注意:在此中不需要行中断,但是为了清楚地添加阅读。
下面是外行对上述DAX语句如何使用这五个参数的描述,按它们的出现顺序排列:
转到' SecurityQuery '表(1英石参数),并在列' SecurityColumn ' [UserName](2 .单击“确定”nd参数),查找符合函数username()返回的值的行(3rd.范围)。然后对于这些行,请占据“SecurityQuery”列中的值(4TH.),并查看这些值是否存在列' Country ' [CountryCode] (5TH.)。如果发现[CountryCode]值,则返回该行的TRUE,并允许它在此上下文中查看。
在实现这种方法时,有两件事需要注意。首先,需要在Country表和SecurityQuery表之间定义一个关系。第二,
如果您遵循了插入脚本,您将记得只有两个人参与其中:Fred和Bob。And you may recall that we granted Fred access to a Group called “Pacific Rim” (which included countries such as Japan, Hong Kong, and the Philippines) but that [GroupMembership] row was NOT flagged with [IsActive] = 0. Fred’s mapped data looks like this:
现在,[securityreference]数据集就发挥作用了。在将其添加为模型的一部分后,您需要确保A)它与任何其他表没有关系,B)它也有一个[UserName] = UserName () DAX Filter表达式应用。
我在我的Power BI模型中添加了一个报表页面,并基于这个表添加了一个简单的矩阵可视化,配置如下:
由此产生的可视化是一个很好的方法,可以准确地看到一个人如何访问任何一个特定国家/地区(通过其中的成员资格),以及他们所拥有的任何群体中的哪些国家也是一个成员,即使该成员资格不是积极的。
确实,这里引入了很多可能不是“行级安全”的东西,而是T-SQL开销。毕竟,您真正需要的是这个3rd.工作的方案是允许访问的不同用户和国家列表。但是,鉴于世界上173个国家,并说,需要进行访问控制的两名人员,这可能是有4,000行数据控制谁可以访问什么。将其分解为用户和团体和成员资格是一种管理混乱的方法。