使用适用于 Power BI 数据集和 Analysis Services 的 DirectQuery(预览版)
- 版本 :2023.1(当前版本)
使用适用于 Power BI 数据集和 Analysis Services 的 DirectQuery(预览版)
借助适用于 Power BI 数据集和 Analysis Services 的 DirectQuery,你可以使用 DirectQuery 连接到 Power BI 数据集、Azure Analysis Services (AAS) 和 SQL Server 2022 (CTP) Analysis Services,甚至可以与其他 DirectQuery 和导入的数据结合使用。 如果报表作者想要将其企业语义模型中的数据与他们所拥有的其他数据(如 Excel 电子表格)组合在一起,或者要从其企业语义模型中个性化或丰富元数据,将会发现此功能特别有用。
启用预览功能
由于此功能目前处于预览阶段,因此你必须首先启用它。 为此,请在 Power BI Desktop 中转到“文件”>“选项和设置”>“选项”,然后在“预览功能”部分,选中“适用于 Power BI 数据集和 Analysis Services 的 DirectQuery”复选框来启用此预览功能。 可能需要重新启动 Power BI Desktop 以使更改生效。
管理此功能
租户管理员可以在管理门户中启用或禁用与 Power BI 数据集的 DirectQuery 连接。 虽然默认情况下启用此功能,但禁用它将有效地阻止用户将 Power BI 数据集上的新复合模型发布到服务。
使用 Power BI 数据集上的复合模型的现有报表将继续运行,并且用户仍可以使用 Desktop 创建复合模型,但无法发布到服务。 相反,通过选择“对此模型进行更改”创建到 Power BI 数据集的 DirectQuery 连接时,你会看到以下警告消息:
这样,你仍然可以在本地 Power BI Desktop 环境中浏览数据集并创建复合模型。 但是,你将无法将报表发布到服务。 发布报表和模型时,你将看到以下错误消息,并且发布会被阻止:
请注意,与 Power BI 数据集的实时连接不受此开关的影响,与 Analysis Services 的实时连接或 DirectQuery 连接也不受影响。 无论此开关是否已关闭,这些连接都会继续运行。 此外,使用 Power BI 数据集上的复合模型的任何已发布报表将继续运行,即使在发布这些报表后禁用了此开关。
使用 DirectQuery 进行实时连接
若要使用适用于 Power BI 数据集和 Analysis Services 的 DirectQuery,要求报表具有本地模型。 可以从实时连接开始,添加或升级到本地模型,或从 DirectQuery 连接或导入数据开始,这将自动在报表中创建本地模型。
若要查看模型中正在使用哪些连接,请查看 Power BI Desktop 右下角的状态栏。 如果你只连接到 Analysis Services 源,则会看到如下所示的消息:
如果连接到 Power BI 数据集,则会看到一条消息,告诉你连接到哪些 Power BI 数据集:
如果要自定义实时连接数据集中的字段元数据,请在状态栏中选择“对此模型进行更改”。 或者,也可以选择功能区中的“对此模型进行更改”按钮,如下图所示。 在“报表视图”中,“对此模型进行更改”按钮在“建模”选项卡中。在“模型视图”中,此按钮位于“主页”选项卡中。
选择该按钮会显示一个对话框,用于确认是否添加了本地模型。 选择“添加本地模型”,以便为 Power BI 数据集或 Analysis Services 中的字段创建新列或修改元数据。 下图显示了出现的对话框。
当你实时连接到 Analysis Services 源时,没有本地模型。 若要将 DirectQuery 用于实时连接的源(如 Power BI 数据集和 Analysis Services),则必须将本地模型添加到报表。 将具有本地模型的报表发布到 Power BI 服务时,还会发布该本地模型的数据集。
链接
数据集,以及它们所基于的数据集和模型构成一个链。 此过程称为“链接”,使你可以基于其他 Power BI 数据集发布报表和数据集(以前无法实现该功能)。
例如,假设你的同事发布了一个名为“销售和预算”的 Power BI 数据集,该数据集基于名为“销售”的 Analysis Services 模型,并将其与名为“预算”的 Excel 工作表结合起来。
在基于同事发布的“销售和预算”Power BI 数据集发布名为“销售和预算(欧洲)”的新报表(和数据集)时,在此过程中进行进一步的修改或扩展,可以将报表和数据集有效地添加到长度为 3 的链,该链从“销售”Analysis Services 模型开始,并以“销售和预算(欧洲)”Power BI 数据集结束。 下图显示了此链接过程。
上图中的链长度为 3,这是此预览期间的最大长度。 不支持超出 3 的链长度,这会导致错误。
安全警告
使用“适用于 Power BI 数据集和 Analysis Services 的 DirectQuery”功能将显示一个安全警告对话框,如下图所示。
数据可以从一个数据源推送到另一个数据源,这是在数据模型中组合 DirectQuery 和导入源的相同安全警告。 若要了解有关此行为的详细信息,请参阅使用 Power BI Desktop 中的复合模型。
要尝试的功能和方案
以下列表提供了有关如何自行探索“适用于 Power BI 数据集和 Analysis Services 的 DirectQuery”的建议:
连接到不同源中的数据:导入(如文件)、Power BI 数据集、Azure Analysis Services
创建不同数据源之间的关系
编写使用不同数据源中的字段的度量值
为 Azure Analysis Services 的 Power BI 数据集中的表创建新列
创建使用不同数据源中的列的视觉对象
自 Power BI Desktop 2021 年 4 月版开始,如果有透视,在对 Analysis Services 模型进行 DirectQuery 连接时,也可以连接到透视。
从 2021 年 10 月版本的 Power BI Desktop 开始,你可以对连接进行更多控制:
可以使用字段列表从模型中删除表,使模型尽可能简洁(如果连接到透视图,则不能从模型中删除表)
可以指定要加载的表,而不必在只需要特定表子集时加载所有表
可以在模型中建立连接后指定是否添加随后添加到数据集的任何表
在 2021 年 10 月版本中,通过并行执行模型查询和智能缓存改进了性能
注意事项和限制
在使用“适用于 Power BI 数据集和 Analysis Services 的 DirectQuery”时,需要注意几个注意事项:
如果在刷新数据源时出现字段或表名冲突的错误,Power BI 将为你解决这些错误。
不能在同一 Power BI 数据集或 Analysis Services 源中编辑、删除或创建新关系。 如果你对这些源具有编辑访问权限,可以直接在数据源中进行更改。
若要在 Power BI 服务中基于另一个数据集的复合模型上生成报表,必须设置所有凭据。 在刷新凭据设置页上,即使已设置凭据,对于 Analysis Services 源,也将显示以下错误:
由于这令人困惑且不正确,我们很快会解决这个问题。
当链中的一个或多个数据集位于 Pro 工作区中时,需要生成权限才能查看使用此功能生成的报表。 如果报表创建者已离开公司或者其生成权限在创建报表后已被撤销,则链中的所有数据集也需要生成权限。
租户需要启用允许对本地数据集使用 XMLA 终结点和“在 Excel 中分析”功能,才能将 DirectQuery 连接到 Power BI 数据集。
连接到本地 SQL Server 2022 和更高版本的 Analysis Services 服务器或 IAAS 需要本地数据网关(标准模式)。
与远程 Power BI 数据集模型的所有连接均使用单一登录进行。 目前不支持使用服务主体进行身份验证。
对于高级容量,“XMLA 终结点”应设置为“只读”或“读/写”。
RLS 规则将应用于定义它们的源,但不会应用于模型中的任何其他数据集。 报表中定义的 RLS 不会应用于远程源,远程源上设置的 RLS 不会应用于其他数据源。 此外,不能在来自另一个源组的表上定义 RLS,也不能在与另一个源组有关系的本地表上定义 RLS。
在此预览版本中,不会从源导入 KPI、行级别安全性和翻译。
使用日期层次结构时,可能会出现一些意外行为。 若要解决此问题,请改用日期列。 将日期层次结构添加到视觉对象后,可以通过单击字段名称中的向下箭头,然后单击该字段的名称来切换到日期列,而不是使用日期层次结构:
有关使用日期列与日期层次结构的详细信息,请参阅此文。
将 AI 功能与具有到 Analysis Services 的 DirectQuery 连接的模型一起使用时,可能会看到无用的错误消息。
将 ALLSELECTED 与 DirectQuery 源结合使用将导致结果不完整。
筛选器和关系:
只能对单个列设置从数据源应用于其他 DirectQuery 源的表的筛选器
不建议使用源外部的表来筛选 DirectQuery 源中的两个表从而实现交叉筛选,也不支持这种设计。
筛选器只能一次接触一个表。 不支持通过 DirectQuery 源外的其中一个表对某表应用相同筛选器两次。
在预览期间,模型链的最大长度为 3。 不支持超出 3 的链长度,这会导致错误。
可以在模型上设置“阻止链接”标志,以防止创建或扩展链。 有关详细信息,请参阅管理与已发布数据集的 DirectQuery 连接。
与 Power BI 数据集的连接不会在 Power Query 中显示。
还需要注意几个限制:
当前禁用了数据库和服务器名称的参数。
不支持从远程源定义表中的 RLS。
不支持使用以下任何源作为 DirectQuery 的源:
SQL Server Analysis Services (SSAS)
SAP HANA
SAP Business Warehouse
实时数据集
示例数据集
Excel 联机刷新
导入 Excel/CSV 文件
使用指标(我的工作区)
当前不支持在“我的工作区”中对数据集使用 DirectQuery。
当前不支持将 Power BI Embedded 和与 Azure Analysis Services 模型建立了 DirectQuery 连接的数据集配合使用。
不支持使用发布到 Web 功能将报表发布到 Web。
不支持远程源上的计算组,其中包含未定义的查询结果。
在使用此功能的服务中不支持计算表。 尝试对具有一个计算表或一个引用 DirectQuery 数据源的计算列的数据集执行刷新操作将导致“未提供单一登录 (SSO) 凭据”错误消息。
如果在设置 DirectQuery 连接后重命名工作区,则需要更新 Power BI Desktop 中的数据源,使报表继续工作。
只有某些情况下才支持自动页面刷新 (APR),具体取决于数据源类型。 有关详细信息,请参阅 Power BI 中的自动页面刷新。
目前不支持接管会使用“到其他数据集的 DirectQuery”功能的数据集。
与任何 DirectQuery 数据源一样,在 DirectQuery 模式下使用 Excel 连接到模型或数据集时,在 Analysis Services 模型或 Power BI 数据集中定义层次结构不会显示。
在跨源组关系中使用低基数列:在两个不同的源组之间创建关系时,参与关系的列(也称为联接列)应具有低基数,理想情况下不超过 50,000。 此注意事项适用于非字符串键列;对于字符串键列,请参阅以下注意事项。
避免在跨源组关系中使用大型字符串键列:创建跨源组关系时,请避免使用大型字符串列作为关系列,尤其是对于较大基数的列。 当必须使用字符串列作为关系列时,通过将基数 (C) 乘以字符串列 (A) 的平均长度来计算筛选器的预期字符串长度。 确保预期的字符串长度低于 250,000,使 A ∗ C < 250,000。
租户注意事项
任何具有到 Power BI 数据集或 Analysis Services 的 DirectQuery 连接的模型都必须在同一租户中发布,这一点在使用 B2B 来宾标识访问 Analysis Services 模型时尤为重要,如下图所示。 请参阅可以编辑和管理内容的来宾用户,查找用于发布的租户 URL。
考虑下图。 图中带编号的步骤将在下面的段落中介绍。
在此图中,Ash 与 Contoso 合作,正在访问 Fabrikam 提供的数据。 Ash 使用 Power BI Desktop 创建与 Analysis Services 模型的 DirectQuery 连接,该模型托管在 Fabrikam 的租户中。
为了进行身份验证,Ash 使用 B2B 来宾用户标识(图中的步骤 1)。
如果将报表发布到 Contoso 的 Power BI 服务(步骤 2),则在 Contoso 租户中发布的数据集将不能成功地对 Fabrikam 的 Analysis Services 模型进行身份验证(步骤 3)。 因此,报表将无法工作。
在此方案中,由于使用的 Analysis Services 模型是在 Fabrikam 的租户中托管的,因此还必须在 Fabrikam 的租户中发布该报表。 在 Fabrikam 的租户中成功发布后(步骤 4),数据集可以成功访问 Analysis Services 模型(步骤 5),报表将正常工作。
具有到受对象级安全性保护的源模型的 DirectQuery 连接的复合模型
当复合模型通过 DirectQuery 从 Power BI 数据集或 Analysis Services 获取数据,并且源模型受对象级安全性保护时,复合模型的使用者可能会注意到意外的结果。 以下部分说明了这些结果是如何产生的。
对象级安全性 (OLS) 使模型作者可以对模型使用者(例如,报表创建者或复合模型作者)隐藏构成模型架构的对象(即,表、列、元数据等)。 在为某个对象配置 OLS 时,模型作者会创建一个角色,然后为分配给该角色的用户删除对该对象的访问权限。 从这些用户的角度来看,隐藏的对象并不存在。
OLS 是为源模型定义的,并且应用在源模型上。 不能为构建在源模型上的复合模型定义它。
当复合模型通过 DirectQuery 连接构建在受 OLS 保护的 Power BI 数据集或 Analysis Services 模型之上时,源模型中的模型架构实际上会复制到复合模型中。 复制的内容取决于复合模型作者根据此处应用的 OLS 规则允许在源模型中看到的内容。 数据本身不会复制到复合模型中,而是在需要时,始终通过 DirectQuery 从源模型中检索数据本身。 换句话说,数据检索始终返回到应用了 OLS 规则的源模型。
由于复合模型不受 OLS 规则保护,因此复合模型使用者看到的对象是指复合模型作者可以在源模型中看到的对象,而不是其本身可能有权访问的对象。 这可能会导致以下情况
查看复合模型的用户可能会在受 OLS 保护的源模型中看到对他们隐藏的对象。
相反,他们可能在复合模型中看不到可以在源模型中看到的对象,因为该对象对因 OLS 规则控制对源模型的访问的复合模型作者隐藏。
很重要的一点是,尽管存在第一项中所述的情况,但复合模型使用者将永远不会看到他们不应看到的实际数据,因为这些数据实际上不在复合模型中。 相反,由于 DirectQuery,会根据需要从源数据集中检索数据,其中 OLS 会阻止未经授权的访问。
考虑到此背景,请考虑以下情况。
Admin_user 已使用 Power BI 数据集或具有“客户”表和“区域”表的 Analysis Services 模型发布了企业语义模型。 Admin_user 将数据集发布到 Power BI 服务,并设置具有以下效果的 OLS 规则:
财务用户看不到“客户”表
市场营销用户看不到“区域”表
Finance_user 发布一个名为“财务数据集”的数据集和一个名为“财务报表”的报表,该报表通过 DirectQuery 连接到步骤 1 中发布的企业语义模型。 “财务”报表包含使用“区域”表中的列的视觉对象。
Marketing_user 打开“财务”报表。 将显示使用“区域”表的视觉对象,但会返回错误,因为在打开该报表时,DirectQuery 会尝试使用 Marketing_user 的凭据从源模型中检索数据,该用户根据企业语义模型上设置的 OLS 规则看不到“区域”表。
Marketing_user 创建一个名为“市场营销报表”的新报表,该报表使用财务数据集作为其源。 字段列表显示 Finance_user 有权访问的表和列。 因此,“区域”表显示在字段列表中,但“客户”表并非如此。 但是,当 Marketing_user 尝试创建利用“区域”表中的列的视觉对象时,将返回错误,因为此时,DirectQuery 会尝试使用 Marketing_user 的凭据从源模型中检索数据,OLS 规则再次发挥作用来阻止访问。 当 Marketing_user 创建连接到具有 DirectQuery 连接的财务数据集的新数据集和报表时,就会发生这种情况,他们会在字段列表中看到“区域”表,因为这是 Finance_user 可以看到的内容,但当他们尝试创建利用该表的视觉对象时,他们将被企业语义模型上的 OLS 规则阻止。
现在,假设 Admin_user 更新企业语义模型上的 OLS 规则,以使财务不会看到“区域”表。
仅当刷新财务数据集时,才会在其中反映更新的 OLS 规则。 因此,当 Finance_user 刷新财务数据集时,“区域”表将不再显示在字段列表中,“财务”报表中使用“区域”表中列的视觉对象将为 Finance_user 返回错误,因为现在不允许他们访问“区域”表。
总结:
复合模型使用者在创建模型时可以看到适用于复合模型作者的 OLS 规则的结果。 因此,当基于复合模型创建新报表时,字段列表将显示复合模型作者在创建该模型时有权访问的表,而不考虑当前用户在源模型中有权访问的内容。
不能在复合模型本身上定义 OLS 规则。
复合模型使用者将永远不会看到他们不应看到的实际数据,因为当 DIrectQuery 尝试使用其凭据检索数据时,源模型上的相关 OLS 规则将会阻止他们。
如果源模型更新了其 OLS 规则,则这些更改只会在刷新复合模型时对其产生影响。
从 Power BI 数据集或 Analysis Services 模型加载表的子集
使用 DirectQuery 连接来连接到 Power BI 数据集或 Analysis Services 模型时,可决定要连接到哪些表。 你也可选择在与模型建立连接后,自动添加任何可能添加到数据集或模型中的表。 在连接到一个透视时,模型将包含数据集或模型内的所有表,并且透视中不包含的任何表都将隐藏。 此外,任何可能会添加到透视的表都将被自动添加。 对于实时连接,不会显示此对话框。
备注
只有在你将与 Power BI 数据集或 Analysis Services 模型的 DirectQuery 连接添加到现有模型时,此对话框才会显示。 你也可在创建数据源后,通过在数据源设置中更改与 Power BI 数据集或 Analysis Services 模型的 DirectQuery 连接来打开此对话框。