为基于 ODBC 的连接器启用 DirectQuery
建议使用 M 的内置 Odbc.DataSource 函数为具有现有 ODBC 驱动程序和/或支持 SQL 查询语法的数据源创建自定义连接器。 通过封装 Odbc.DataSource 函数,连接器可以根据驱动程序报告的功能继承默认查询折叠行为。 此行为使 M 引擎能够根据 Power Query 体验中用户定义的筛选器和其他转换生成 SQL 语句,而无需在连接器本身中提供此逻辑。
ODBC 扩展可以选择启用 DirectQuery 模式,允许 Power BI 在运行时动态生成查询,而无需预先缓存用户的数据模型。
备注
启用 DirectQuery 支持会增加连接器的难度和复杂性。 启用 DirectQuery 后,Power BI 会阻止 M 引擎对无法完全推送到底层数据源的操作进行补偿。
本文假定读者已熟悉创建基本的自定义连接器。
有关以下部分的大部分代码示例,请参阅 SqlODBC 示例。 可以在 ODBC 示例目录中找到其他示例。
M 引擎提供两个 ODBC 相关的数据源函数:Odbc.DataSource 和 Odbc.Query。
Odbc.DataSource 函数提供默认导航表,其中包含系统中的所有数据库、表和视图。 此函数还支持查询折叠,并允许一系列自定义选项。 大多数基于 ODBC 的扩展使用此函数作为其主要可扩展性函数。 该函数接受两个参数:连接字符串和用于重写行为的选项记录。
Odbc.Query 函数允许通过 ODBC 驱动程序执行 SQL 语句。 该函数充当查询执行的传递器。 与 Odbc.DataSource 函数不同,它不提供查询折叠功能,并且要求连接器(或最终用户)提供 SQL 查询。 生成自定义连接器时,此函数通常用于内部运行查询,检索可能未通过常规 ODBC 通道公开的元数据。 该函数接受两个参数:连接字符串和 SQL 查询。
自定义连接器可以接受任意数量的函数参数。 但为了与 Power Query 提供的内置数据源函数保持一致,建议遵循以下指南:
需要用于建立与服务器连接的最小参数集。 最终用户需要提供的参数越少,连接器就越容易使用。
尽管可以使用固定数量的值(例如,UI 中的下拉列表)定义参数,但需要在用户进行身份验证之前输入参数。 用户通过身份验证后可以通过编程发现的任何值(如目录或数据库名称)都应可以通过导航器进行选择。 Odbc.DataSource 函数的默认行为是返回由目录(数据库)、架构和表名称组成的分层导航表。 不过,可以在连接器中重写此行为。
如果用户通常知道从导航器中选择的项目应输入什么值(如数据库名称),则可将这些参数设为可选参数。 可以通过编程发现的参数不应设为必填参数。
函数的最后一个参数应该是名为“选项”的可选记录。 该参数通常允许高级用户设置常用的 ODBC 相关属性(如
CommandTimeout
),设置连接器特有的行为重写,并在不影响功能向后兼容性的情况下实现未来的可扩展性。与安全/凭据相关的参数不得成为数据源函数参数的一部分,因为连接对话框中输入的值将持久化保存到用户的查询中。 凭据相关参数应指定为连接器支持的身份验证方法的一部分。
默认情况下,数据源函数的所有必需参数都纳入用于识别用户凭据的数据源路径值中。
虽然内置 Odbc.DataSource 函数的 UI 提供下拉列表,允许用户选择 DSN,但此功能无法通过可扩展性实现。 如果数据源配置足够复杂,需要完全自定义的配置对话框,建议要求最终用户预先配置系统 DSN,并将函数作为文本字段包含在 DSN 名称中。