角色

适用于: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

表格模型中的角色定义模型的成员权限。 该角色的成员可按照角色权限的定义对模型执行操作。 使用读取权限定义的角色也可以通过使用行级别筛选器在行级别提供附加的安全性。

对于Azure Analysis Services和 Power BI 数据集,用户必须位于你的Microsoft Entra ID 中,用户名和组必须由组织电子邮件地址或 UPN 指定。 对于SQL Server Analysis Services,角色包含按 Windows 用户名或 Windows 组划分的用户成员,以及 (读取、处理、管理员) 的权限。 对于Azure Analysis Services和 Power BI 语义模型,用户必须位于 Azure Active Directory 中,并且用户名和组必须由组织电子邮件地址或 UPN 指定。 对于SQL Server Analysis Services,角色包含按 Windows 用户名或 Windows 组划分的用户成员,以及 (读取、处理、管理员) 的权限。

重要

使用 Visual Studio 创建角色并将组织用户添加到将部署到 Azure Analysis Services 或 Power BI 的表格模型项目时,请使用集成工作区

重要

对于使用报表客户端应用程序连接到已部署模型的用户,必须至少创建一个具有这些用户成员的读取权限的角色。

本文中的信息适用于使用 SSDT 中的“角色管理器”对话框定义角色的表格模型作者。 在模型创作期间定义的角色适用于模型工作区数据库。 部署模型数据库后,模型数据库管理员可以使用 SSMS 管理 (添加、编辑、删除) 角色成员。

了解角色

Analysis Services 中使用角色来管理模型数据访问。 有两种类型的角色:

  • 服务器角色,一个固定角色,提供对 Analysis Services 服务器实例的管理员访问权限。 服务器角色不适用于 Power BI。 相反,Power BI 使用 工作区角色

  • 数据库角色,这些角色由模型作者和管理员定义,用于控制非管理员用户对模型数据库和数据的访问权限。

为表格模型定义的角色就是数据库角色。 也就是说,角色包含由用户或组组成的成员,这些用户或组具有特定权限,这些权限定义这些成员可以对模型数据库执行的操作。 角色作为数据库中的单独对象创建,并且仅适用于在其中创建了该角色的数据库。 用户和组由模型作者包含在角色中,默认情况下,该角色对工作区数据库服务器具有管理员权限;由管理员部署的模型。

表格模型中的角色可以使用行筛选器(也称为 行级别安全性)进一步定义。 行筛选器使用 DAX 表达式定义表中的行,以及许多方向中用户可以查询的任何相关行。 只能为“读取”和“读取和处理”权限定义使用 DAX 表达式的行筛选器。 在 Power BI 中,模型角色在 Power BI Desktop 中定义,仅适用于行级别安全性。 若要了解详细信息,请参阅本文后面的 行筛选器

默认情况下,创建新的表格模型项目时,该项目没有任何角色。 可使用 SSDT 中的“角色管理器”对话框定义角色。 在创作模型期间定义角色后,这些角色将应用于模型工作区数据库。 部署模型时,应对已部署模型使用相同的角色。 部署模型后,服务器角色的成员 ([Analysis Services 管理员) 和数据库管理员可以使用 SSMS 管理与模型关联的角色以及与每个角色关联的成员。

权限

本节中所述的角色权限仅适用于Azure Analysis Services和SQL Server Analysis Services。 在 Power BI 中,为语义模型定义权限。 若要了解详细信息,请参阅 管理语义模型访问

每个角色都具有单个定义的数据库权限(合并的“读取和处理”权限除外)。 默认情况下,新角色将具有“无”权限。 也就是说,一旦将成员添加到具有“无”权限的角色,除非授予其他权限,否则,这些成员将无法修改数据库、运行处理操作、查询数据或查看数据库。

组或用户可以是任意数量的角色的成员,每个角色具有不同的权限。 在某一用户是多个角色的成员时,为每个角色定义的权限将累积。 例如,如果某个用户是具有“读取”权限的角色的成员,并且还是具有“无”权限的角色的成员,则该用户将具有“读取”权限。

每个角色都可以定义下列权限之一:

权限 描述 使用 DAX 的行筛选器
成员无法对模型数据库架构进行任何修改,也无法查询数据。 不应用行筛选器。 此角色中的用户无法看见数据
读取 允许成员查询数据(基于行筛选器),但是无法看到 SSMS 中的模型数据库,无法更改模型数据库架构,并且用户无法处理模型。 应用行筛选器。 用户仅能看见在行筛选器 DAX 公式中指定的数据。
读取和处理 允许成员查询数据(基于行级别筛选器)并通过运行包含处理命令的脚本或包来运行处理操作,但无法对数据库进行任何更改。 无法在 SSMS 中查看模型数据库。 应用行筛选器。 仅能查询在行筛选器 DAX 公式中指定的数据。
进程 成员可以通过运行包含处理命令的脚本或包来运行处理操作。 不能修改模型数据库架构。 无法查询数据。 无法在 SSMS 中查询模型数据库。 不应用行筛选器。 此角色中没有可查询的数据
管理员 成员可以对模型架构进行修改,并且可以查询模型设计器、报表客户端和 SSMS 中的所有数据。 不应用行筛选器。 此角色中的所有数据均可查询。

注意

具有读取和读取以及处理权限的成员可以根据行筛选器查询数据,但在 SSMS 中看不到模型数据库。 成员无法对模型数据库架构进行更改,也无法处理模型。 但是,在 2019 SQL Server Analysis Services 及更早版本中,成员可以使用 DMV 来确定度量值定义。 SQL Server Analysis Services 2022 及更高版本阻止访问 DMV 以提高安全性。

行筛选器

行筛选器(在 Power BI 中通常称为行级安全性)定义表中的哪些行可由特定角色的成员查询。 可使用 DAX 公式为模型中的每个表定义行筛选器。

可仅为具有“读取”和“读取和处理”权限的角色定义行筛选器。 默认情况下,如果没有为某一特定表定义行筛选器,则具有“读取”和“读取和处理”权限的角色的成员将能够查询表中的所有行,除非交叉筛选应用于其他表。

一旦为特定表定义了行筛选器后,求值结果必须为 TRUE/FALSE 值的 DAX 公式将定义可供该特定角色的成员进行查询的行。 未包含在 DAX 公式中的行将不可查询。 例如,对于销售角色的成员,具有以下行筛选器表达式 =Customers [Country] = “USA”(销售角色的成员)的 Customers 表将只能看到美国的客户。

行筛选器应用于指定的行以及相关行。 如果表具有多个关系,筛选器将对处于活动状态的关系应用安全性。 行筛选器将与为相关表定义的其他行筛选器相交,例如:

DAX 表达式
区域 =Region[Country]="USA"
ProductCategory =ProductCategory[Name]="Bicycles"
事务 =Transactions[Year]=2020

这些权限对“事务”表的净影响是,将允许成员查询客户在美国的数据行,产品类别为自行车,年份为 2020 年。 除非用户是授予这些权限的另一个角色的成员,否则用户将无法查询美国以外的任何事务、任何非自行车事务或 2020 年未查询的任何事务。

可以使用筛选器 =FALSE() 拒绝访问整个表的所有行。

若要详细了解 Power BI 中的模型角色,请参阅 Power BI 中的行级别安全性

动态安全性

动态安全性提供了一种基于当前登录用户的用户名或从连接字符串返回的 CustomData 属性定义行级别安全性的方法。 为了实现动态安全性,您必须在模型中包含一个具有用户登录名(Windows 用户名)值的表以及一个可用于定义特定权限的字段;例如,一个具有登录 ID (domain\username) 的 dimEmployees 表以及一个针对每个员工的部门值。

为了实现动态安全性,您可以使用以下函数作为 DAX 公式的一部分来返回当前登录用户的用户名,或者返回连接字符串中的 CustomData 属性:

函数 说明
USERNAME 函数 (DAX) 返回当前登录用户的 domain\username。
CUSTOMDATA 函数 (DAX) 返回连接字符串中的 CustomData 属性。

您可以使用 LOOKUPVALUE 函数返回某一列的值,在该列中,Windows 用户名与 USERNAME 函数返回的用户名或 CustomData 函数返回的字符串相同。 然后,可以限制查询,只显示 LOOKUPVALUE 返回的值与相同或相关表中的值匹配的行。

例如,使用以下公式:

='dimDepartment'[DepartmentId]=LOOKUPVALUE('dimEmployees'[DepartmentId], 'dimEmployees'[LoginId], USERNAME(), 'dimEmployees'[LoginId], 'dimDepartment'[DepartmentId])

LOOKUPVALUE 函数返回 dimEmployees[DepartmentId] 列的值,其中 dimEmployees[LoginId] 与当前登录的用户的 LoginID 相同,由 USERNAME 返回,而 dimEmployees[DepartmentId] 的值与 dimDepartment[DepartmentId] 的值相同。 然后,使用 LOOKUPVALUE 所返回的 DepartmentId 中的值来限制在 dimDepartment 表中查询的行以及通过 DepartmentId 关联的任何表。 将只返回其 DepartmentId 也在 LOOKUPVALUE 函数返回的 DepartmentId 的值中的行。

dimEmployees

LastName FirstName LoginId DepartmentName DepartmentId
Brown Kevin Adventure-works\kevin0 Marketing 7
Bradley David Adventure-works\david0 Marketing 7
Dobney JoLynn Adventure-works\JoLynn0 生产 4
Baretto DeMattos Paula Adventure-works\Paula0 Human Resources 2

dimDepartment

DepartmentId DepartmentName
1 企业
2 一般行政和管理
3 库存管理
4 制造
5 质量保证
6 研究和开发
7 销售和营销

测试角色

在 Visual Studio 中创作模型项目时,可以使用“在 Excel 中分析”功能来测试已定义的角色的有效性。 从模型设计器中的 “模型” 菜单中,当您单击 “在 Excel 中分析”时,在打开 Excel 之前,将会出现 “选择凭据和透视” 对话框。 在此对话框中,您可以指定当前用户名、其他用户名、角色和一个用于连接作为数据源的工作区模型的透视。 若要了解详细信息,请参阅 “在 Excel 中分析”安装在同一台计算机上。

脚本角色

可以通过使用 表格模型脚本语言 (TMSL) 创建或修改 Roles 对象来编写已部署模型和语义模型的角色。 TMSL 脚本可在 SSMS 中执行,也可使用 Invoke-ASCmd PowerShell cmdlet 来执行。

另请参阅

创建和管理角色
透视
在 Excel 中分析
USERNAME 函数 (DAX)
LOOKUPVALUE 函数 (DAX)
CUSTOMDATA 函数 (DAX)