通过


创建外部数据源(Transact-SQL)

applies to: SQL Server 2016 (13.x) 及更高版本 Azure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)SQL 分析 Microsoft Fabric<终结点 /c11>warehouse in Microsoft FabricSQL database in Microsoft Fabric

创建用于查询外部数据的外部数据源,用于 PolyBase 和数据虚拟化功能。

本文提供所选任何 SQL 产品的语法、参数、注解、权限和示例。

选择一个产品

在下面的行中,选择你感兴趣的产品名称,系统将只显示该产品的信息。

* SQL Server *  

 

概述:SQL Server 2016

应用到:SQL Server 2016 (13.x)

为 PolyBase 查询创建外部数据源。 外部数据源用于建立连接以及支持以下这些用例:

  • 在 SQL ServerPolyBase 进行数据虚拟化和数据加载>
  • 使用 BULK INSERTOPENROWSET 大容量加载操作

注意

的语法因 SQL 数据库引擎。 使用版本选择器下拉列表 选择相应的产品版本。 若要查看 SQL Server 2019 (15.x)的功能,请访问 CREATE EXTERNAL DATA SOURCE。 若要查看 SQL Server 2022 (16.x)的功能,请访问 CREATE EXTERNAL DATA SOURCE

Transact-SQL语法约定

SQL Server 2016 的语法

CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
  ( [ LOCATION = '<prefix>://<path>[:<port>]' ]
    [ [ , ] CREDENTIAL = <credential_name> ]
    [ [ , ] TYPE = { HADOOP } ]
    [ [ , ] RESOURCE_MANAGER_LOCATION = '<resource_manager>[:<port>]' )
[ ; ]

参数

data_source_name

指定数据源的用户定义名称。 该名称在SQL Server中的数据库中必须唯一。

LOCATION = '<prefix>://<path[:p ort]>'

提供连接协议和外部数据源的路径。

外部数据源 连接器位置前缀 位置路径 产品/服务支持的位置 身份验证
Cloudera CDH 或 Hortonworks HDP hdfs <Namenode>[:port] SQL Server 2016 (13.x) 到 2019 SQL Server (15.x) 匿名或基本身份验证
Azure 存储帐户(V2) wasb[s] <container>@<storage_account>.blob.core.windows.net 从 SQL Server 2016 开始 (13.x)
不支持分层命名空间
Azure 存储帐户密钥

位置路径:

  • <Namenode> = Hadoop 群集中 Namenode 的计算机名称、名称服务 URI 或 IP 地址。 PolyBase 必须解析 Hadoop 群集使用的任何 DNS 名称。
  • port = 外部数据源侦听的端口。 在 Hadoop 中,可以使用 fs.defaultFS 配置参数查找该端口。 默认值为 8020。
  • <container> = 保存数据的存储帐户的容器。 根容器是只读的,数据无法写回容器。
  • <storage_account> = Azure 资源的存储帐户名称。
  • <server_name> = 主机名。
  • <instance_name> = 命名实例SQL Server的名称。 如果在目标实例上运行SQL Server浏览器服务,则使用。

设置位置时的其他说明和指南:

  • 创建对象时,SQL Server 数据库引擎不会验证外部数据源是否存在。 要进行验证,请使用外部数据源创建外部表。
  • 查询 Hadoop 时,所有表使用相同的外部数据源,以确保查询语义一致。
  • wasbs是可选的,但建议在 SQL Server 2016 (13.x) 中访问Azure 存储帐户,因为将使用安全的 TLS/SSL 连接发送数据。
  • 要确保在 Hadoop Namenode 故障转移期间成功进行 PolyBase 查询,请考虑针对 Hadoop 群集的 Namenode 使用虚拟 IP 地址。 否则,请执行 ALTER EXTERNAL DATA SOURCE 以指向新位置。

CREDENTIAL = credential_name

指定用于对外部数据源进行身份验证的数据库范围凭据。

只有在数据得到保护的情况下才需要 CREDENTIAL。 允许匿名访问的数据集不需要 CREDENTIAL

若要创建数据库范围的凭据,请参阅 CREATE DATABASE SCOPED CREDENTIAL

类型 = * [ HADOOP ] *

指定要配置的外部数据源的类型。 在 SQL Server 2016 中,此参数始终是必需的,应仅指定为 HADOOP。 支持连接到 Cloudera CDH、Hortonworks HDP 或 Azure 存储 帐户。 此参数的行为在更高版本的 SQL Server 中有所不同。

有关使用 TYPE = HADOOP 从Azure 存储帐户加载数据的示例,请参阅 创建外部数据源以使用 wasb:// 接口访问Azure 存储中的数据

RESOURCE_MANAGER_LOCATION = *'ResourceManager_URI[:p ort]'

仅在连接到 Cloudera CDH、Hortonworks HDP 或Azure 存储帐户时配置此可选值。 有关受支持的 Hadoop 版本的完整列表,请参阅 PolyBase 连接配置

定义 RESOURCE_MANAGER_LOCATION 后,查询优化器做出基于成本的决策,以提高性能。 MapReduce 作业可用于将计算下推到 Hadoop。 指定 RESOURCE_MANAGER_LOCATION 可以显著减少 Hadoop 和 SQL Server 之间传输的数据量,这可以提高查询性能。

如果未指定资源管理器,则会为 PolyBase 查询禁用将计算推送到 Hadoop。 创建外部数据源以引用启用了下推功能的 Hadoop 中提供了具体示例和详细指南。

创建外部数据源时,不会验证RESOURCE_MANAGER_LOCATION值。 输入不正确的值可能会导致每次尝试下推时查询失败,因为提供的值无法解析。

为了使 PolyBase 能够正常访问 Hadoop 外部数据源,以下 Hadoop 群集组件的端口必须处于打开状态:

  • HDFS 端口
    • Namenode
    • DataNode
  • 资源管理器
    • 作业提交
  • 作业历史记录

如果未指定端口,则使用“hadoop 连接”配置的当前设置选择默认值。

Hadoop 连接 默认资源管理器端口
1 50300
2 50300
3 8021
4 8032
5 8050
6 8032
7 8050
8 8032

下表显示了这些组件的默认端口。 存在 Hadoop 版本依赖关系,以及不使用默认端口分配的自定义配置的可能性。

Hadoop 群集组件 “默认端口”
NameNode 8020
DataNode(数据传输、非特权 IPC 端口) 50010
DataNode(数据传输、特权 IPC 端口) 1019
资源管理器工作提交(Hortonworks 1.3) 50300
资源管理器作业提交(Cloudera 4.3) 8021
资源管理器作业提交(Linux 上的 Windows Cloudera 5.x 上的 Hortonworks 2.0) 8032
资源管理器作业提交 (Linux 上的 Hortonworks 2.x, 3.0, Hortonworks 2.1-3 on Windows) 8050
资源管理器作业历史记录 10020

权限

需要对 SQL Server 中的数据库具有 CONTROL 权限。

锁定

EXTERNAL DATA SOURCE 对象采用共享锁。

安全性

PolyBase 支持大多数外部数据源的基于代理的身份验证。 创建数据库范围凭据以创建代理帐户。

示例

重要

有关如何安装和启用 PolyBase 的信息,请参阅 WindowsInstall PolyBase>

答: 创建外部数据源以引用 Hadoop

若要创建外部数据源来引用 Hortonworks HDP 或 Cloudera CDH Hadoop 群集,请指定 Hadoop Namenode 的计算机名称/IP 地址和端口。

CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://10.10.10.10:8050'
);

B. 创建外部数据源以引用 Hadoop 并启用下推

指定 RESOURCE_MANAGER_LOCATION 选项以便为 PolyBase 查询启用到 Hadoop 的下推计算。 启用后,PolyBase 会根据成本作出决策,以确定是否应将查询计算下推到 Hadoop。

CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://10.10.10.10:8020',
    RESOURCE_MANAGER_LOCATION = '10.10.10.10:8050'
);

C. 创建外部数据源以引用受 Kerberos 保护的 Hadoop

若要验证 Hadoop 群集是否受 Kerberos 保护,请检查 Hadoop core-site.xml 中的 hadoop.security.authentication 属性值。 若要引用受 Kerberos 保护的 Hadoop 群集,必须指定包含 Kerberos 用户名和密码的数据库范围凭据。 数据库主密钥用于加密数据库范围凭据密钥。

-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

-- Create a database scoped credential with Kerberos user name and password.
CREATE DATABASE SCOPED CREDENTIAL HadoopUser1
WITH IDENTITY = '<hadoop_user_name>',
     SECRET = '<hadoop_password>';

-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://10.10.10.10:8050',
    CREDENTIAL = HadoopUser1,
    RESOURCE_MANAGER_LOCATION = '10.10.10.10:8050'
);

D. 使用 wasb:// 接口创建外部数据源以访问Azure 存储中的数据

在此示例中,外部数据源是名为 logs 的 Azure V2 存储帐户。 存储容器命名 daily为 。 Azure 存储外部数据源仅用于数据传输。 它不支持谓词下推。 通过 wasb:// 接口访问数据时,不支持分层命名空间。

此示例演示如何创建数据库范围的凭据以向 Azure V2 存储帐户进行身份验证。 在数据库凭据机密中指定Azure 存储帐户密钥。 可以在数据库范围内凭据标识中指定任何字符串,因为它在身份验证期间未用于Azure 存储。 通过 wasbwasbs 连接到Azure 存储时,必须使用存储帐户密钥而不是共享访问签名(SAS)进行身份验证。

在 SQL Server 2016(13.x),即使访问Azure 存储,TYPE应设置为 HADOOP

-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
     SECRET = '<azure_storage_account_key>';

-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
    TYPE = HADOOP,
    LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
    CREDENTIAL = AzureStorageCredential
);

概述:SQL Server 2017

应用到:SQL Server 2017 (14.x)

为 PolyBase 查询创建外部数据源。 外部数据源用于建立连接以及支持以下这些用例:

  • 在 SQL ServerPolyBase 进行数据虚拟化和数据加载>
  • 使用 BULK INSERTOPENROWSET 大容量加载操作

注意

CREATE EXTERNAL DATA SOURCE的语法因不同版本的Linux 上的 SQL Server而异。 使用版本选择器下拉列表选择适当的版本。
若要查看 SQL Server 2019 (15.x)的功能,请访问 CREATE EXTERNAL DATA SOURCE。 若要查看 SQL Server 2022 (16.x)的功能,请访问 CREATE EXTERNAL DATA SOURCE

注意

的语法因 SQL 数据库引擎。 使用版本选择器下拉列表 选择相应的产品版本
若要查看 SQL Server 2019 (15.x)的功能,请访问 CREATE EXTERNAL DATA SOURCE。 若要查看 SQL Server 2022 (16.x)的功能,请访问 CREATE EXTERNAL DATA SOURCE

Transact-SQL语法约定

SQL Server 2017 的语法

CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
  ( [ LOCATION = '<prefix>://<path>[:<port>]' ]
    [ [ , ] CREDENTIAL = <credential_name> ]
    [ [ , ] TYPE = { HADOOP | BLOB_STORAGE } ]
    [ [ , ] RESOURCE_MANAGER_LOCATION = '<resource_manager>[:<port>]' )
[ ; ]

参数

data_source_name

指定数据源的用户定义名称。 该名称在SQL Server中的数据库中必须唯一。

LOCATION = '<prefix>://<path[:p ort]>'

提供连接协议和外部数据源的路径。

外部数据源 连接器位置前缀 位置路径 产品/服务支持的位置 身份验证
Cloudera CDH 或 Hortonworks HDP hdfs <Namenode>[:port] SQL Server 2016 (13.x) 到 SQL Server 2019 (仅 15.x) 匿名或基本身份验证
Azure 存储帐户(V2) wasb[s] <container>@<storage_account>.blob.core.windows.net 从 SQL Server 2016 开始 (13.x)
不支持分层命名空间
Azure 存储帐户密钥
批量操作 https <storage_account>.blob.core.windows.net/<container> 从 SQL Server 2017 (14.x) 开始 共享访问签名 (SAS)

位置路径:

  • <Namenode> = Hadoop 群集中 Namenode 的计算机名称、名称服务 URI 或 IP 地址。 PolyBase 必须解析 Hadoop 群集使用的任何 DNS 名称。
  • port = 外部数据源侦听的端口。 在 Hadoop 中,可以使用 fs.defaultFS 配置参数查找该端口。 默认值为 8020。
  • <container> = 保存数据的存储帐户的容器。 根容器是只读的,数据无法写回容器。
  • <storage_account> = Azure 资源的存储帐户名称。
  • <server_name> = 主机名。
  • <instance_name> = 命名实例SQL Server的名称。 如果在目标实例上运行SQL Server浏览器服务,则使用。

设置位置时的其他说明和指南:

  • 创建对象时,SQL Server 数据库引擎不会验证外部数据源是否存在。 要进行验证,请使用外部数据源创建外部表。
  • 查询 Hadoop 时,所有表使用相同的外部数据源,以确保查询语义一致。
  • 通过 Driver={<Name of Driver>} 连接时,请指定 ODBC
  • wasbs是可选的,但建议在 SQL Server 2017 (14.x) 中访问Azure 存储帐户,因为将使用安全的 TLS/SSL 连接发送数据。
  • 要确保在 Hadoop Namenode 故障转移期间成功进行 PolyBase 查询,请考虑针对 Hadoop 群集的 Namenode 使用虚拟 IP 地址。 否则,请执行 ALTER EXTERNAL DATA SOURCE 以指向新位置。

CREDENTIAL = credential_name

指定用于对外部数据源进行身份验证的数据库范围凭据。

创建凭证时的其他说明和指导:

  • 只有在数据得到保护的情况下才需要 CREDENTIAL。 允许匿名访问的数据集不需要 CREDENTIAL
  • TYPE = BLOB_STORAGE 时,必须使用 SHARED ACCESS SIGNATURE 作为标识创建凭据。
  • TYPE = BLOB_STORAGE 仅允许批量作;不能使用 TYPE = BLOB_STORAGE.. 为外部数据源创建外部表。
  • 通过 wasbwasbs 连接到Azure 存储时,必须使用存储帐户密钥而不是共享访问签名(SAS)进行身份验证。
  • TYPE = HADOOP 时,必须使用存储帐户密钥作为 SECRET 创建凭据。

创建共享访问签名的方式有很多种:

  • 可以通过导航到 Azure 门户 -><Your_Storage_Account> -> 共享访问签名 -> 配置权限 -> 生成 SAS 和连接字符串来创建 SAS 令牌。 有关详细信息,请参阅生成共享访问签名

  • 可以使用 Azure 存储资源管理器 创建和配置 SAS

  • 可以通过 PowerShell、Azure CLI、.NET 和 REST API 以编程方式创建 SAS 令牌。 有关详细信息,请参阅 使用共享访问签名 (SAS) 限制对Azure 存储资源的访问权限。

  • 应按如下所示配置 SAS 令牌:

    • 生成 SAS 令牌时,它会在令牌开头包含问号('?')。 配置为密码时排除前导 ?
    • 使用有效的有效期(所有日期均采用 UTC 时间)。
  • 至少授予对应加载的文件的读取权限(例如 srt=o&sp=r)。 可以为不同的用例创建多个共享访问签名。 应按如下所示授予权限:

    操作 权限
    从文件中读取数据 读取
    从多个文件和子文件夹读取数据 读取和列出

有关将 CREDENTIALSHARED ACCESS SIGNATURETYPE = BLOB_STORAGE 配合使用的示例,请参阅 创建外部数据源以执行批量操作并将数据从 Azure 存储 检索到 SQL 数据库

若要创建数据库范围的凭据,请参阅 CREATE DATABASE SCOPED CREDENTIAL

TYPE = * [ HADOOP |BLOB_STORAGE ] *

指定要配置的外部数据源的类型。 此参数并非始终是必需的,仅当连接到 Cloudera CDH、Hortonworks HDP、Azure 存储 帐户或Azure Data Lake Storage Gen2时,才应指定此参数。

  • 当外部数据源为 Cloudera CDH、Hortonworks HDP、Azure 存储 帐户或Azure Data Lake Storage Gen2时,请使用 HADOOP
  • 使用 BULK INSERTOPENROWSET BULK>。 SQL Server 2017(14.x)引入。 在打算针对Azure 存储CREATE EXTERNAL TABLE时,请使用 HADOOP

注意

即使访问Azure 存储,也应将 TYPE 设置为 HADOOP

有关使用 TYPE = HADOOP 从Azure 存储帐户加载数据的示例,请参阅 使用 wasb:// 接口访问Azure 存储中的数据

RESOURCE_MANAGER_LOCATION = “ResourceManager_URI[:p ort]”

仅在连接到 Cloudera CDH、Hortonworks HDP 或Azure 存储帐户时配置此可选值。 有关受支持的 Hadoop 版本的完整列表,请参阅 PolyBase 连接配置

定义 RESOURCE_MANAGER_LOCATION 后,查询优化器将根据成本做出决策以提高性能。 MapReduce 作业可用于将计算下推到 Hadoop。 指定 RESOURCE_MANAGER_LOCATION 可以显著减少 Hadoop 和 SQL Server 之间传输的数据量,这可以提高查询性能。

如果未指定资源管理器,则会为 PolyBase 查询禁用将计算推送到 Hadoop。 创建外部数据源以引用启用了下推功能的 Hadoop 中提供了具体示例和详细指南。

RESOURCE_MANAGER_LOCATION创建外部数据源时不会验证该值。 输入不正确的值可能会导致每次尝试下推时查询失败,因为提供的值无法解析。

为了使 PolyBase 能够正常访问 Hadoop 外部数据源,以下 Hadoop 群集组件的端口必须处于打开状态:

  • HDFS 端口
    • Namenode
    • DataNode
  • 资源管理器
    • 作业提交
  • 作业历史记录

如果未指定端口,则使用“hadoop 连接”配置的当前设置选择默认值。

Hadoop 连接 默认资源管理器端口
1 50300
2 50300
3 8021
4 8032
5 8050
6 8032
7 8050
8 8032

下表显示了这些组件的默认端口。 存在 Hadoop 版本依赖关系,以及不使用默认端口分配的自定义配置的可能性。

Hadoop 群集组件 “默认端口”
NameNode 8020
DataNode(数据传输、非特权 IPC 端口) 50010
DataNode(数据传输、特权 IPC 端口) 1019
资源管理器工作提交(Hortonworks 1.3) 50300
资源管理器作业提交(Cloudera 4.3) 8021
资源管理器作业提交(Linux 上的 Windows Cloudera 5.x 上的 Hortonworks 2.0) 8032
资源管理器作业提交 (Linux 上的 Hortonworks 2.x, 3.0, Hortonworks 2.1-3 on Windows) 8050
资源管理器作业历史记录 10020

权限

需要对 SQL Server 中的数据库具有 CONTROL 权限。

锁定

EXTERNAL DATA SOURCE 对象采用共享锁。

安全性

PolyBase 支持大多数外部数据源的基于代理的身份验证。 创建数据库范围凭据以创建代理帐户。

不支持类型 HADOOP 为 SAS 令牌。 仅在使用存储帐户访问密钥时,才支持类型为 BLOB_STORAGE 的 SAS 令牌。 尝试创建类型为 HADOOP 的外部数据源和使用 SAS 凭据失败,并显示以下错误:

Msg 105019, Level 16, State 1 - EXTERNAL TABLE access failed due to internal error: 'Java exception raised on call to HdfsBridge_Connect. Java exception message: Parameters provided to connect to the Azure storage account aren't valid.: Error [Parameters provided to connect to the Azure storage account aren't valid.] occurred while accessing external file.'

示例

重要

有关如何安装和启用 PolyBase 的信息,请参阅 WindowsInstall PolyBase>

答: 创建外部数据源以引用 Hadoop

若要创建外部数据源来引用 Hortonworks HDP 或 Cloudera CDH Hadoop 群集,请指定 Hadoop Namenode 的计算机名称/IP 地址和端口。

CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://10.10.10.10:8050'
);

B. 创建外部数据源以引用 Hadoop 并启用下推

指定 RESOURCE_MANAGER_LOCATION 选项以便为 PolyBase 查询启用到 Hadoop 的下推计算。 启用后,PolyBase 会根据成本作出决策,以确定是否应将查询计算下推到 Hadoop。

CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://10.10.10.10:8020',
    RESOURCE_MANAGER_LOCATION = '10.10.10.10:8050'
);

C. 创建外部数据源以引用受 Kerberos 保护的 Hadoop

若要验证 Hadoop 群集是否受 Kerberos 保护,请检查 Hadoop core-site.xml 中的 hadoop.security.authentication 属性值。 若要引用受 Kerberos 保护的 Hadoop 群集,必须指定包含 Kerberos 用户名和密码的数据库范围凭据。 数据库主密钥用于加密数据库范围凭据密钥。

-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

-- Create a database scoped credential with Kerberos user name and password.
CREATE DATABASE SCOPED CREDENTIAL HadoopUser1
WITH IDENTITY = '<hadoop_user_name>',
     SECRET = '<hadoop_password>';

-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://10.10.10.10:8050',
    CREDENTIAL = HadoopUser1,
    RESOURCE_MANAGER_LOCATION = '10.10.10.10:8050'
);

D. 使用 wasb:// 接口创建外部数据源以访问Azure 存储中的数据

在此示例中,外部数据源是名为 logs 的 Azure V2 存储帐户。 存储容器命名 daily为 。 Azure 存储外部数据源仅用于数据传输。 它不支持谓词下推。 通过 wasb:// 接口访问数据时,不支持分层命名空间。 通过 wasbwasbs 连接到Azure 存储时,必须使用存储帐户密钥而不是共享访问签名(SAS)进行身份验证。

此示例演示如何创建数据库范围的凭据以向 Azure V2 存储帐户进行身份验证。 在数据库凭据机密中指定Azure 存储帐户密钥。 可以在数据库范围内凭据标识中指定任何字符串,因为它在身份验证期间未用于Azure 存储。

-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
     SECRET = '<azure_storage_account_key>';

-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
    TYPE = HADOOP,
    LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
    CREDENTIAL = AzureStorageCredential
);

示例:批量操作

重要

在为批量作配置外部数据源时,不要在 URL 末尾/添加尾随LOCATION、文件名或共享访问签名参数。

E. 为从Azure 存储检索数据的批量操作创建外部数据源

Applies to: SQL Server 2017(14.x)及更高版本。

使用以下数据源通过 BULK INSERTOPENROWSET BULK 执行批量作。 凭据必须设置 SHARED ACCESS SIGNATURE 作为标识、不应在 SAS 令牌中具有前导 ?、必须对应加载的文件(例如 srt=o&sp=r)至少具有读取权限,并且有效期应有效(所有日期均采用 UTC 时间)。 有关共享访问签名的详细信息,请参阅使用共享访问签名 (SAS)

CREATE DATABASE SCOPED CREDENTIAL AccessAzureInvoices
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
     SECRET = -- Remove ? from the beginning of the SAS token'<azure_storage_account_key>';

CREATE EXTERNAL DATA SOURCE MyAzureInvoices
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://newinvoices.blob.core.windows.net/week3',
    CREDENTIAL = AccessAzureInvoices
);

若要查看这一使用中的示例,请参阅 BULK INSERT

概述:SQL Server 2019

应用到:SQL Server 2019 (15.x)

为 PolyBase 查询创建外部数据源。 外部数据源用于建立连接以及支持以下这些用例:

  • 在 SQL ServerPolyBase 进行数据虚拟化和数据加载>
  • 使用 BULK INSERTOPENROWSET 大容量加载操作

注意

的语法因 SQL 数据库引擎。 使用版本选择器下拉列表 选择相应的产品版本
若要查看 SQL Server 2022 (16.x)的功能,请访问 CREATE EXTERNAL DATA SOURCE

注意

的语法因 SQL 数据库引擎。 使用版本选择器下拉列表 选择相应的产品版本
若要查看 SQL Server 2022 (16.x)的功能,请访问 CREATE EXTERNAL DATA SOURCE

Transact-SQL语法约定

SQL Server 2019 的语法

CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
  ( [ LOCATION = '<prefix>://<path>[:<port>]' ]
    [ [ , ] CONNECTION_OPTIONS = '<key_value_pairs>'[,...]]
    [ [ , ] CREDENTIAL = <credential_name> ]
    [ [ , ] PUSHDOWN = { ON | OFF } ]
    [ [ , ] TYPE = { HADOOP | BLOB_STORAGE } ]
    [ [ , ] RESOURCE_MANAGER_LOCATION = '<resource_manager>[:<port>]' ]
  )
[ ; ]

参数

data_source_name

指定数据源的用户定义名称。 该名称在SQL Server中的数据库中必须唯一。

LOCATION = '<prefix>://<path[:p ort]>'

提供连接协议和外部数据源的路径。

外部数据源 连接器位置前缀 位置路径 产品/服务支持的位置 身份验证
Cloudera CDH 或 Hortonworks HDP hdfs <Namenode>[:port] SQL Server 2016 (13.x) 到 2019 SQL Server (15.x) 匿名或基本身份验证
Azure 存储帐户(V2) wasb[s] <container>@<storage_account>.blob.core.windows.net 从 SQL Server 2016 开始 (13.x)
不支持分层命名空间
Azure 存储帐户密钥
SQL Server sqlserver <server_name>[\<instance_name>][:port] 从 SQL Server 2019 (15.x) 开始 仅 SQL 身份验证
神谕 oracle <server_name>[:port] 从 SQL Server 2019 (15.x) 开始 仅基本身份验证
Teradata teradata <server_name>[:port] 从 SQL Server 2019 (15.x) 开始 仅基本身份验证
MongoDB 或 Cosmos DB API for MongoDB mongodb <server_name>[:port] 从 SQL Server 2019 (15.x) 开始 仅基本身份验证
泛型 ODBC odbc <server_name>[:port] 从 SQL Server 2019 (15.x) 开始 - 仅Windows 仅基本身份验证
批量操作 https <storage_account>.blob.core.windows.net/<container> 从 SQL Server 2017 (14.x) 开始 共享访问签名 (SAS)
Azure Data Lake Storage Gen2 abfs[s] abfss://<container>@<storage_account>.dfs.core.windows.net 从 SQL Server 2019 (15.x) CU11+ 开始。 存储访问密钥
SQL Server 大数据群集数据池 sqldatapool sqldatapool://controller-svc/default 仅在 2019 SQL Server 大数据群集中受支持 仅基本身份验证
SQL Server 大数据群集存储池 sqlhdfs sqlhdfs://controller-svc/default 仅在 2019 SQL Server 大数据群集中受支持 仅基本身份验证

位置路径:

  • <Namenode> = Hadoop 群集中 Namenode 的计算机名称、名称服务 URI 或 IP 地址。 PolyBase 必须解析 Hadoop 群集使用的任何 DNS 名称。
  • port = 外部数据源侦听的端口。 在 Hadoop 中,可以使用 fs.defaultFS 配置参数查找该端口。 默认值为 8020。
  • <container> = 保存数据的存储帐户的容器。 根容器是只读的,数据无法写回容器。
  • <storage_account> = Azure 资源的存储帐户名称。
  • <server_name> = 主机名。
  • <instance_name> = 命名实例SQL Server的名称。 如果在目标实例上运行SQL Server浏览器服务,则使用。

设置位置时的其他说明和指南:

  • 创建对象时,SQL Server 数据库引擎不会验证外部数据源是否存在。 要进行验证,请使用外部数据源创建外部表。
  • 查询 Hadoop 时,所有表使用相同的外部数据源,以确保查询语义一致。
  • 可以使用 sqlserver 连接器将 SQL Server 2019 (15.x) 连接到另一个SQL Server或Azure SQL 数据库。
  • 通过 Driver={<Name of Driver>} 连接时,请指定 ODBC
  • 使用 wasbsabfss 是可选的,但建议在 2019 SQL Server (15.x) 中访问Azure 存储帐户,因为将使用安全的 TLS/SSL 连接发送数据。
  • 从 SQL Server 2019 (15.x) CU1 开始访问Azure 存储帐户时,支持 abfsabfss API。 有关详细信息,请参阅 Azure Blob 文件系统驱动程序 (ABFS)
  • Azure Data Lake Storage Gen2 从 SQL Server 2019 (15.x) CU11+ 开始,支持使用 abfs[s] 的 Azure 存储帐户(V2)的分层命名空间选项。 如果不满足上述条件,则不支持分层命名空间选项,且此选项应保持禁用。
  • 要确保在 Hadoop Namenode 故障转移期间成功进行 PolyBase 查询,请考虑针对 Hadoop 群集的 Namenode 使用虚拟 IP 地址。 否则,请执行 ALTER EXTERNAL DATA SOURCE 以指向新位置。
  • 支持在大数据群集的主实例和存储池之间连接 sqlhdfssqldatapool 类型。 对于 Cloudera CDH 或 Hortonworks HDP,请使用 hdfs。 有关使用 sqlhdfs 查询SQL Server 大数据群集存储池的详细信息,请参阅 SQL Server 2019 大数据群集中的 Query HDFS
  • SQL Server对 HDFS Cloudera (CDP) 和 Hortonworks (HDP) 外部数据源的支持已停用,并且未包含在 SQL Server 2022(16.x)及更高版本中。 有关详细信息,请参阅 Microsoft SQL Server 平台上的 Big 数据选项

CONNECTION_OPTIONS = key_value_pair

为 SQL Server 2019(15.x)及更高版本指定。 通过 ODBC 连接到外部数据源时指定其他选项。 若要使用多个连接选项,请用分号分隔它们。

适用于泛型 ODBC 连接,以及适用于 SQL Server、Oracle、Teradata、MongoDB 和 Azure Cosmos DB API 的内置 ODBC 连接器。

key_value_pair 是特定连接选项的关键字和值。 哪些关键字和值可用由外部数据源类型决定。 驱动程序的名称是必需的(最基本的要求),但设置其他选项(例如 APP='<your_application_name>'ApplicationIntent= ReadOnly|ReadWrite)也很有用,可以帮助进行故障排除。

可能的键值对特定于外部数据源供应商的提供程序。 有关每个提供程序的详细信息,请参阅 CREATE EXTERNAL DATA SOURCE (Transact-SQL) CONNECTION_OPTIONS

SQL Server 2019 (15.x) 累积更新 19 及更高版本引入了其他关键字来支持 Oracle TNS 文件:

  • 关键字 TNSNamesFile 指定位于 Oracle 服务器上的 tnsnames.ora 文件的文件路径。
  • 关键字 ServerName 指定 tnsnames.ora 内使用的别名,该别名将用于替换主机名和端口。

Pushdown = 打开 | 关闭

仅针对 SQL Server 2019 (15.x) 指定。 说明是否可以将计算下推到外部数据源。 默认为 ON

连接到外部数据源级别的 SQL Server、Oracle、Teradata、MongoDB、Azure Cosmos DB API for MongoDB 或 ODBC 时,支持 PUSHDOWN

通过 EXTERNALPUSHDOWN 提示在查询级别启用或禁用下推。

CREDENTIAL = credential_name

指定用于对外部数据源进行身份验证的数据库范围凭据。

创建凭证时的其他说明和指导:

  • 只有在数据得到保护的情况下才需要 CREDENTIAL。 允许匿名访问的数据集不需要 CREDENTIAL
  • TYPE = BLOB_STORAGE 时,必须使用 SHARED ACCESS SIGNATURE 作为标识创建凭据。
  • TYPE = BLOB_STORAGE 仅允许批量作;不能使用 TYPE = BLOB_STORAGE.. 为外部数据源创建外部表。

创建共享访问签名的方式有很多种:

  • 可以通过导航到 Azure 门户 -><Your_Storage_Account> -> 共享访问签名 -> 配置权限 -> 生成 SAS 和连接字符串来创建 SAS 令牌。 有关详细信息,请参阅生成共享访问签名

  • 可以使用 Azure 存储资源管理器 创建和配置 SAS

  • 可以通过 PowerShell、Azure CLI、.NET 和 REST API 以编程方式创建 SAS 令牌。 有关详细信息,请参阅 使用共享访问签名 (SAS) 限制对Azure 存储资源的访问权限。

  • 应按如下所示配置 SAS 令牌:

    • 生成 SAS 令牌时,它会在令牌开头包含问号('?')。 配置为密码时排除前导 ?
    • 使用有效的有效期(所有日期均采用 UTC 时间)。
  • 至少授予对应加载的文件的读取权限(例如 srt=o&sp=r)。 可以为不同的用例创建多个共享访问签名。 应按如下所示授予权限:

    操作 权限
    从文件中读取数据 读取
    从多个文件和子文件夹读取数据 读取和列出

有关将 CREDENTIALSHARED ACCESS SIGNATURETYPE = BLOB_STORAGE 配合使用的示例,请参阅 创建外部数据源以执行批量操作并将数据从 Azure 存储 检索到 SQL 数据库

若要创建数据库范围的凭据,请参阅 CREATE DATABASE SCOPED CREDENTIAL

TYPE = * [ HADOOP |BLOB_STORAGE ] *

指定要配置的外部数据源的类型。 此参数并非始终是必需的,仅当连接到 Cloudera CDH、Hortonworks HDP、Azure 存储 帐户或Azure Data Lake Storage Gen2时,才应指定此参数。

  • 在 SQL Server 2019 (15.x),除非连接到 Cloudera CDH、Hortonworks HDP(Azure 存储帐户),否则不要指定 TYPE。
  • 当外部数据源为 Cloudera CDH、Hortonworks HDP、Azure 存储 帐户或Azure Data Lake Storage Gen2时,请使用 HADOOP
  • 使用 BULK INSERTOPENROWSET BULK>,SQL Server 2017 (14.x)。 在打算针对Azure 存储创建 EXTERNAL TABLE 时,请使用 HADOOP
  • SQL Server对 HDFS Cloudera (CDP) 和 Hortonworks (HDP) 外部数据源的支持已停用,并且未包含在 SQL Server 2022(16.x)及更高版本中。 有关详细信息,请参阅 Microsoft SQL Server 平台上的 Big 数据选项

有关使用 TYPE = HADOOP 从 Azure 存储 帐户加载数据的示例,请参阅 创建外部数据源,以使用 wasb:// 接口访问Azure 存储中的数据。

RESOURCE_MANAGER_LOCATION = “ResourceManager_URI[:p ort]”

在 SQL Server 2019(15.x),除非连接到 Cloudera CDH、Hortonworks HDP(Azure 存储帐户),否则不要指定RESOURCE_MANAGER_LOCATION。

仅在连接到 Cloudera CDH、Hortonworks HDP 或Azure 存储帐户时配置此可选值。 有关受支持的 Hadoop 版本的完整列表,请参阅 PolyBase 连接配置

定义 RESOURCE_MANAGER_LOCATION 后,查询优化器做出基于成本的决策,以提高性能。 MapReduce 作业可用于将计算下推到 Hadoop。 指定 RESOURCE_MANAGER_LOCATION 可以显著减少 Hadoop 和 SQL Server 之间传输的数据量,这可以提高查询性能。

如果未指定资源管理器,则会为 PolyBase 查询禁用将计算推送到 Hadoop。 创建外部数据源以引用启用了下推功能的 Hadoop 中提供了具体示例和详细指南。

创建外部数据源时,不会验证RESOURCE_MANAGER_LOCATION值。 输入不正确的值可能会导致每次尝试下推时查询失败,因为提供的值无法解析。

为了使 PolyBase 能够正常访问 Hadoop 外部数据源,以下 Hadoop 群集组件的端口必须处于打开状态:

  • HDFS 端口
    • Namenode
    • DataNode
  • 资源管理器
    • 作业提交
  • 作业历史记录

如果未指定端口,则使用“hadoop 连接”配置的当前设置选择默认值。

Hadoop 连接 默认资源管理器端口
1 50300
2 50300
3 8021
4 8032
5 8050
6 8032
7 8050
8 8032

下表显示了这些组件的默认端口。 存在 Hadoop 版本依赖关系,以及不使用默认端口分配的自定义配置的可能性。

Hadoop 群集组件 “默认端口”
NameNode 8020
DataNode(数据传输、非特权 IPC 端口) 50010
DataNode(数据传输、特权 IPC 端口) 1019
资源管理器工作提交(Hortonworks 1.3) 50300
资源管理器作业提交(Cloudera 4.3) 8021
资源管理器作业提交(Linux 上的 Windows Cloudera 5.x 上的 Hortonworks 2.0) 8032
资源管理器作业提交 (Linux 上的 Hortonworks 2.x, 3.0, Hortonworks 2.1-3 on Windows) 8050
资源管理器作业历史记录 10020

权限

需要对 SQL Server 中的数据库具有 CONTROL 权限。

锁定

EXTERNAL DATA SOURCE 对象采用共享锁。

安全性

PolyBase 支持大多数外部数据源的基于代理的身份验证。 创建数据库范围凭据以创建代理帐户。

连接到 SQL Server 2019 大数据群集中的存储或数据池时,用户的凭据将传递到后端系统。 在数据池本身中创建登录名以启用直通身份验证。

不支持类型 HADOOP 为 SAS 令牌。 仅在使用存储帐户访问密钥时,才支持类型为 BLOB_STORAGE 的 SAS 令牌。 尝试创建类型为 HADOOP 的外部数据源和使用 SAS 凭据失败,并显示以下错误:

Msg 105019, Level 16, State 1 - EXTERNAL TABLE access failed due to internal error: 'Java exception raised on call to HdfsBridge_Connect. Java exception message: Parameters provided to connect to the Azure storage account aren't valid.: Error [Parameters provided to connect to the Azure storage account aren't valid.] occurred while accessing external file.'

示例

重要

有关如何安装和启用 PolyBase 的信息,请参阅 WindowsInstall PolyBase>

答: 在 SQL Server 2019 中创建外部数据源以引用 Oracle

要创建引用 Oracle 的外部数据源,请确保具有数据库范围凭据。 还可以选择对此数据源启用或禁用计算下推。

-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL OracleProxyAccount
WITH IDENTITY = 'oracle_username',
     SECRET = 'oracle_password';

CREATE EXTERNAL DATA SOURCE MyOracleServer
WITH (
    LOCATION = 'oracle://145.145.145.145:1521',
    PUSHDOWN = ON,
    CREDENTIAL = OracleProxyAccount
);

(可选)Oracle 的外部数据源可以使用代理身份验证提供精细的访问控制。 可以将代理用户配置为,与被模拟的用户相比,具有有限的访问权限。

CREATE DATABASE SCOPED CREDENTIAL [OracleProxyCredential]
WITH IDENTITY = 'oracle_username',
     SECRET = 'oracle_password';

CREATE EXTERNAL DATA SOURCE [OracleSalesSrvr]
WITH (
    LOCATION = 'oracle://145.145.145.145:1521',
    CONNECTION_OPTIONS = 'ImpersonateUser=%CURRENT_USER',
    CREDENTIAL = [OracleProxyCredential]
);

或者,可以使用 TNS 身份验证。

从 SQL Server 2019(15.x) 累积更新 19 开始,CREATE EXTERNAL DATA SOURCE现在支持在连接到 Oracle 时使用 TNS 文件。

CONNECTION_OPTIONS 参数已扩展,现在使用 TNSNamesFileServerName 作为变量来浏览 tnsnames.ora 文件并与服务器建立连接。

在下面的示例中,在运行时SQL Server期间,将搜索由 TNSNamesFile 指定的 tnsnames.ora 文件位置,并搜索由 ServerName 指定的主机和网络端口。

CREATE EXTERNAL DATA SOURCE [external_data_source_name]
WITH (
    LOCATION = N'oracle://XE',
    CREDENTIAL = [OracleCredentialTest],
    CONNECTION_OPTIONS = N'TNSNamesFile=C:\Temp\tnsnames.ora;ServerName=XE'
);

有关其他数据源(如 MongoDB)的更多示例,请参阅配置 PolyBase 以访问 MongoDB 中的外部数据

B. 创建外部数据源以引用 Hadoop

若要创建外部数据源来引用 Hortonworks HDP 或 Cloudera CDH Hadoop 群集,请指定 Hadoop Namenode 的计算机名称/IP 地址和端口。

CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://10.10.10.10:8050'
);

C. 创建外部数据源以引用 Hadoop 并启用下推

指定 RESOURCE_MANAGER_LOCATION 选项以便为 PolyBase 查询启用到 Hadoop 的下推计算。 启用后,PolyBase 会根据成本作出决策,以确定是否应将查询计算下推到 Hadoop。

CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://10.10.10.10:8020',
    RESOURCE_MANAGER_LOCATION = '10.10.10.10:8050'
);

D. 创建外部数据源以引用受 Kerberos 保护的 Hadoop

若要验证 Hadoop 群集是否受 Kerberos 保护,请检查 Hadoop core-site.xml 中的 hadoop.security.authentication 属性值。 若要引用受 Kerberos 保护的 Hadoop 群集,必须指定包含 Kerberos 用户名和密码的数据库范围凭据。 数据库主密钥用于加密数据库范围凭据密钥。

-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

-- Create a database scoped credential with Kerberos user name and password.
CREATE DATABASE SCOPED CREDENTIAL HadoopUser1
WITH IDENTITY = '<hadoop_user_name>',
     SECRET = '<hadoop_password>';

-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://10.10.10.10:8050',
    CREDENTIAL = HadoopUser1,
    RESOURCE_MANAGER_LOCATION = '10.10.10.10:8050'
);

E. 使用 wasb:// 接口创建外部数据源以访问Azure 存储中的数据

在此示例中,外部数据源是名为 logs 的 Azure V2 存储帐户。 存储容器命名 daily为 。 Azure 存储外部数据源仅用于数据传输。 它不支持谓词下推。 通过 wasb:// 接口访问数据时,不支持分层命名空间。 通过 wasbwasbs 连接到Azure 存储时,必须使用存储帐户密钥而不是共享访问签名(SAS)进行身份验证。

此示例演示如何创建数据库范围的凭据以向 Azure V2 存储帐户进行身份验证。 在数据库凭据机密中指定Azure 存储帐户密钥。 可以在数据库范围内凭据标识中指定任何字符串,因为它在身份验证期间未用于Azure 存储。

-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
     SECRET = '<azure_storage_account_key>';

-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
    TYPE = HADOOP,
    LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
    CREDENTIAL = AzureStorageCredential
);

F. 创建外部数据源以通过 PolyBase 连接引用SQL Server命名实例

应用到: SQL Server 2019 (15.x) 及更高版本

若要创建引用SQL Server命名实例的外部数据源,请使用 CONNECTION_OPTIONS 指定实例名称。

在下面的示例中,WINSQL2019 是主机名,而 SQL2019 是实例名。 'Server=%s\SQL2019' 是键值对。

CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
    LOCATION = 'sqlserver://WINSQL2019',
    CONNECTION_OPTIONS = 'Server=%s\SQL2019',
    CREDENTIAL = SQLServerCredentials
);

或者,可以使用端口连接到SQL Server默认实例。

CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
    LOCATION = 'sqlserver://WINSQL2019:58137',
    CREDENTIAL = SQLServerCredentials
);

G. 创建外部数据源以引用 Always On 可用性组的可读次要副本

应用到: SQL Server 2019 (15.x) 及更高版本

若要创建引用 SQL Server 的可读次要副本的外部数据源,请使用 CONNECTION_OPTIONS 指定 ApplicationIntent=ReadOnly。 此外,需要将可用性数据库 Database={dbname} 设置为 in CONNECTION_OPTIONS,或将可用性数据库设置为用于数据库作用域凭据的登录名的默认数据库。 需要在可用性组的所有可用性副本上执行此作。

首先,创建数据库限定范围的凭据,为经过身份验证的 SQL 登录名存储凭据。 用于 PolyBase 的 SQL ODBC 连接器仅支持基本身份验证。 创建数据库范围凭据之前,数据库必须具有主密钥用于保护凭据。 有关详细信息,请参阅 CREATE MASTER KEY。 以下示例创建数据库限定范围的凭据,提供自己的登录名和密码。

CREATE DATABASE SCOPED CREDENTIAL SQLServerCredentials
WITH IDENTITY = 'username',
     SECRET = 'password';

接下来,创建新的外部数据源。

无论是在Database=dbnameCONNECTION_OPTIONS数据库范围内凭据中包括可用性数据库还是将可用性数据库设置为登录名的默认数据库,仍必须在 LOCATION 参数中通过 CREATE EXTERNAL TABLE 语句中的三部分名称提供数据库名称。 有关示例,请参阅 CREATE EXTERNAL TABLE

在下面的示例中,WINSQL2019AGL 是可用性组侦听程序名称,dbname 是要成为 CREATE EXTERNAL TABLE 语句目标的数据库的名称。

CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
    LOCATION = 'sqlserver://WINSQL2019AGL',
    CONNECTION_OPTIONS = 'ApplicationIntent=ReadOnly; Database=dbname',
    CREDENTIAL = SQLServerCredentials
);

可以通过在系统视图 ApplicationIntent 上指定 sys.servers 并创建外部表来演示可用性组的重定向行为。 在以下示例脚本中,会创建两个外部数据源,并为每个外部数据源创建一个外部表。 使用视图测试哪个服务器在响应连接。 还可以通过只读路由功能实现类似结果。 有关详细信息,请参阅为 Always On 可用性组配置只读路由

CREATE EXTERNAL DATA SOURCE [DataSource_SQLInstanceListener_ReadOnlyIntent]
WITH (
    LOCATION = 'sqlserver://WINSQL2019AGL',
    CONNECTION_OPTIONS = 'ApplicationIntent=ReadOnly; Database=dbname',
    CREDENTIAL = [SQLServerCredentials]
);
GO

CREATE EXTERNAL DATA SOURCE [DataSource_SQLInstanceListener_ReadWriteIntent]
WITH (
    LOCATION = 'sqlserver://WINSQL2019AGL',
    CONNECTION_OPTIONS = 'ApplicationIntent=ReadWrite',
    CREDENTIAL = [SQLServerCredentials]
);
GO

在可用性组的数据库内,创建视图以返回 sys.servers 和本地实例的名称,这可帮助确定哪个副本在响应查询。 有关详细信息,请参阅 sys.servers

CREATE VIEW vw_sys_servers
AS
SELECT [name]
FROM sys.servers
WHERE server_id = 0;
GO

然后,在源实例上创建外部表:

CREATE EXTERNAL TABLE vw_sys_servers_ro (name SYSNAME NOT NULL)
WITH (
    DATA_SOURCE = [DataSource_SQLInstanceListener_ReadOnlyIntent],
    LOCATION = N'dbname.dbo.vw_sys_servers'
);
GO

CREATE EXTERNAL TABLE vw_sys_servers_rw (name SYSNAME NOT NULL)
WITH (
    DATA_SOURCE = [DataSource_SQLInstanceListener_ReadWriteIntent],
    LOCATION = N'dbname.dbo.vw_sys_servers'
);
GO

SELECT [name]
FROM dbo.vw_sys_servers_ro;--should return secondary replica instance

SELECT [name]
FROM dbo.vw_sys_servers_rw;--should return primary replica instance
GO

示例:批量操作

重要

在为批量作配置外部数据源时,不要在 URL 末尾/添加尾随LOCATION、文件名或共享访问签名参数。

H. 为从Azure 存储检索数据的批量操作创建外部数据源

应用到: SQL Server 2017 (14.x) 和 SQL Server 2019 (15.x)

使用以下数据源通过 BULK INSERTOPENROWSET BULK 执行批量作。 凭据必须设置 SHARED ACCESS SIGNATURE 作为标识、不应在 SAS 令牌中具有前导 ?、必须对应加载的文件(例如 srt=o&sp=r)至少具有读取权限,并且有效期应有效(所有日期均采用 UTC 时间)。 有关共享访问签名的详细信息,请参阅使用共享访问签名 (SAS)

CREATE DATABASE SCOPED CREDENTIAL AccessAzureInvoices
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
     SECRET = -- Remove ? from the beginning of the SAS token'<azure_shared_access_signature>';

CREATE EXTERNAL DATA SOURCE MyAzureInvoices
WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://newinvoices.blob.core.windows.net/week3',
    CREDENTIAL = AccessAzureInvoices
);

若要查看这一使用中的示例,请参阅 BULK INSERT

一。 使用 abfs:// 接口创建外部数据源以访问Azure 存储中的数据

应用到: SQL Server 2019 (15.x) CU11 及更高版本

在此示例中,外部数据源是Azure Data Lake Storage Gen2帐户logs,使用 Azure Blob 文件系统驱动程序 (ABFS)。 存储容器命名 daily为 。 Azure Data Lake Storage Gen2外部数据源仅用于数据传输,因为不支持谓词下推。

此示例演示如何创建数据库范围的凭据以向Azure Data Lake Storage Gen2帐户进行身份验证。 在数据库凭据机密中指定Azure 存储帐户密钥。 可以在数据库范围内凭据标识中指定任何字符串,因为它在身份验证期间未用于Azure 存储。

-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
     SECRET = '<azure_storage_account_key>';

-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
    TYPE = HADOOP,
    LOCATION = 'abfss://daily@logs.dfs.core.windows.net/',
    CREDENTIAL = AzureStorageCredential
);

J. 使用泛型 ODBC 创建到 PostgreSQL 的外部数据源

与前面示例一样,先创建数据库主密钥和数据库范围凭据。 数据库范围的凭据将用于外部数据源。 此示例还假定服务器上安装了适用于 PostgreSQL 的泛型 ODBC 数据提供程序。

在本例中,泛型 ODBC 数据提供程序用于连接到同一网络中的 PostgreSQL 数据库服务器,其中 PostgreSQL 服务器的完全限定域名为 POSTGRES1,使用的默认端口是 TCP 5432。

CREATE EXTERNAL DATA SOURCE POSTGRES1
WITH (
    LOCATION = 'odbc://POSTGRES1.domain:5432',
    CONNECTION_OPTIONS = 'Driver={PostgreSQL Unicode(x64)};',
    CREDENTIAL = postgres_credential
);

概述:SQL Server 2022

应用到:SQL Server 2022(16.x)及更高版本

为 PolyBase 查询创建外部数据源。 外部数据源用于建立连接以及支持以下这些用例:

  • 在 SQL ServerPolyBase 进行数据虚拟化和数据加载>
  • 使用 BULK INSERTOPENROWSET 大容量加载操作

注意

的语法因 SQL 数据库引擎。 使用版本选择器下拉列表 选择相应的产品版本。 此内容适用于 SQL Server 2022(16.x)及更高版本。

SQL Server 2022 的语法

SQL Server 2022 及更高版本的语法

CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
  ( [ LOCATION = '<prefix>://<path>[:<port>]' ]
    [ [ , ] CONNECTION_OPTIONS = '<key_value_pairs>'[,...]]
    [ [ , ] CREDENTIAL = <credential_name> ]
    [ [ , ] PUSHDOWN = { ON | OFF } ]
  )
[ ; ]

参数

data_source_name

指定数据源的用户定义名称。 该名称在SQL Server中的数据库中必须唯一。

LOCATION = '<prefix>://<path[:p ort]>'

提供连接协议和外部数据源的路径。

外部数据源 连接器位置前缀 位置路径 产品/服务支持的位置 身份验证
Azure 存储帐户(V2) abs abs://<container_name>@<storage_account_name>.blob.core.windows.net/

abs://<storage_account_name>.blob.core.windows.net/<container_name>
从 SQL Server 2022 (16.x) 开始
支持分层命名空间。
共享访问签名 (SAS)
Azure Data Lake Storage Gen2 adls adls://<container_name>@<storage_account_name>.dfs.core.windows.net/

adls://<storage_account_name>.dfs.core.windows.net/<container_name>
从 SQL Server 2022 (16.x) 开始 共享访问签名 (SAS)
SQL Server sqlserver <server_name>[\<instance_name>][:port] 从 SQL Server 2019 (15.x) 开始 仅 SQL 身份验证
神谕 oracle <server_name>[:port] 从 SQL Server 2019 (15.x) 开始 仅基本身份验证
Teradata teradata <server_name>[:port] 从 SQL Server 2019 (15.x) 开始 仅基本身份验证
MongoDB 或 Cosmos DB API for MongoDB mongodb <server_name>[:port] 从 SQL Server 2019 (15.x) 开始 仅基本身份验证
泛型 ODBC odbc <server_name>[:port] 从 SQL Server 2019 (15.x) 开始 - 仅Windows 仅基本身份验证
批量操作 https <storage_account>.blob.core.windows.net/<container> 从 SQL Server 2017 (14.x) 开始 共享访问签名 (SAS)
S3 兼容的对象存储 s3 - S3 兼容: s3://<server_name>:<port>/
- AWS S3: s3://<bucket_name>.S3.amazonaws.com[:port]/<folder>
s3://s3.amazonaws.com[:port]/<bucket_name>/<folder>
从 SQL Server 2022 (16.x) 开始 基本或直通 (STS) *

* 必须是 数据库范围的凭据,其中 IDENTITY 硬编码, IDENTITY = 'S3 Access Key' SECRET 参数采用格式 = '<AccessKeyID>:<SecretKeyID>' 或使用直通 (STS) 授权。 有关详细信息,请参阅配置 PolyBase 以访问 S3 兼容的对象存储中的外部数据

位置路径:

  • port = 外部数据源侦听的端口。 在许多情况下(具体取决于网络配置)是可选的。
  • <container_name> = 保存数据的存储帐户的容器。 根容器是只读的,数据无法写回容器。
  • <storage_account> = Azure 资源的存储帐户名称。
  • <server_name> = 主机名。
  • <instance_name> = 命名实例SQL Server的名称。 如果在目标实例上运行SQL Server浏览器服务,则使用。
  • <ip_address>:<port> = 仅适用于 S3 兼容的对象存储(从 SQL Server 2022(16.x)开始),用于连接到 S3 兼容存储的终结点和端口。
  • <bucket_name> = 仅适用于 S3 兼容的对象存储(从 SQL Server 2022 (16.x)开始),特定于存储平台。
  • <region> = 仅适用于 S3 兼容的对象存储(从 SQL Server 2022 (16.x)开始),特定于存储平台。
  • <folder> = 存储 URL 中的存储路径的一部分。

设置位置时的其他说明和指南:

  • 创建对象时,SQL Server 数据库引擎不会验证外部数据源是否存在。 要进行验证,请使用外部数据源创建外部表。
  • 可以使用 sqlserver 连接器将 SQL Server 2019 (15.x) 连接到另一个SQL Server或Azure SQL 数据库。
  • 通过 Driver={<Name of Driver>} 连接时,请指定 ODBC
  • SQL Server 2022(16.x)中,Azure Data Lake Storage Gen2 支持使用前缀 adls 的分层命名空间选项Azure 存储帐户(V2)。
  • SQL Server对 HDFS Cloudera (CDP) 和 Hortonworks (HDP) 外部数据源的支持已停用,并且不包括在 2022 年 SQL Server (16.x) 中。 无需在 2022 SQL Server (16.x) 中使用 TYPE 参数。
  • 有关从 SQL Server 2022 (16.x) 开始的 S3 兼容对象存储和 PolyBase 的详细信息,请参阅 配置 PolyBase 以访问 S3 兼容对象存储中的外部数据。 有关在 S3 兼容对象存储中查询 parquet 文件的示例,请参阅使用 PolyBase 虚拟化 S3 兼容对象存储中的 parquet 文件
  • 与以前的版本不同,SQL Server 2022(16.x),用于Azure 存储帐户(v2)的前缀从 wasb[s] 更改为 abs
  • 与以前的版本不同,在 SQL Server 2022 (16.x),用于Azure Data Lake Storage Gen2的前缀从 abfs[s] 更改为 adls
  • 有关使用 PolyBase 在 Azure 存储 中虚拟化 CSV 文件的示例,请参阅 使用 PolyBase 虚拟化 CSV 文件
  • 有关使用 PolyBase 在 ADLS Gen2 中虚拟化 Delta 表的示例,请参阅使用 PolyBase 虚拟化 Delta 表
  • SQL Server 2022(16.x)完全支持Azure 存储帐户 v2(abs)和 Azure Data Lake Gen2(adls)的两种 URL 格式。
    • LOCATION 路径可以使用格式:<container>@<storage_account_name>..(建议)或 <storage_account_name>../<container>。 例如:
      • Azure 存储帐户 v2:abs://<container>@<storage_account_name>.blob.core.windows.net(建议)或 abs://<storage_account_name>.blob.core.windows.net/<container>
  • Azure Data Lake Gen2 支持:adls://<container>@<storage_account_name>.blob.core.windows.net(建议)或 adls://<storage_account_name>.dfs.core.windows.net/<container>

CONNECTION_OPTIONS = key_value_pair

为 SQL Server 2019(15.x)及更高版本指定。 通过 ODBC 连接到外部数据源时指定其他选项。 若要使用多个连接选项,请用分号分隔它们。

适用于泛型 ODBC 连接,以及适用于 SQL Server、Oracle、Teradata、MongoDB 和 Azure Cosmos DB API 的内置 ODBC 连接器。

key_value_pair 是特定连接选项的关键字和值。 哪些关键字和值可用由外部数据源类型决定。 驱动程序的名称是必需的(最基本的要求),但设置其他选项(例如 APP='<your_application_name>'ApplicationIntent= ReadOnly|ReadWrite)也很有用,可以帮助进行故障排除。

可能的键值对特定于驱动程序。 有关每个提供程序的详细信息,请参阅 CREATE EXTERNAL DATA SOURCE (Transact-SQL) CONNECTION_OPTIONS

从 2022 年 SQL Server (16.x) 累积更新 2 开始,引入了其他关键字以支持 Oracle TNS 文件:

  • 关键字 TNSNamesFile 指定位于 Oracle 服务器上的 tnsnames.ora 文件的文件路径。
  • 关键字 ServerName 指定 tnsnames.ora 内使用的别名,该别名将用于替换主机名和端口。

PUSHDOWN = 打开 | 关闭

适用于:SQL Server 2019(15.x)及更高版本。 说明是否可以将计算下推到外部数据源。 默认情况下,它已打开。

连接到外部数据源级别的 SQL Server、Oracle、Teradata、MongoDB、Azure Cosmos DB API for MongoDB 或 ODBC 时,支持 PUSHDOWN

通过 EXTERNALPUSHDOWN 提示在查询级别启用或禁用下推。

CREDENTIAL = credential_name

指定用于对外部数据源进行身份验证的数据库范围凭据。

创建凭证时的其他说明和指导:

创建共享访问签名的方式有很多种:

  • 可以通过导航到 Azure 门户 -><Your_Storage_Account> -> 共享访问签名 -> 配置权限 -> 生成 SAS 和连接字符串来创建 SAS 令牌。 有关详细信息,请参阅生成共享访问签名

  • 可以使用 Azure 存储资源管理器 创建和配置 SAS

  • 可以通过 PowerShell、Azure CLI、.NET 和 REST API 以编程方式创建 SAS 令牌。 有关详细信息,请参阅 使用共享访问签名 (SAS) 限制对Azure 存储资源的访问权限。

  • 应按如下所示配置 SAS 令牌:

    • 生成 SAS 令牌时,它会在令牌开头包含问号('?')。 配置为密码时排除前导 ?
    • 使用有效的有效期(所有日期均采用 UTC 时间)。
  • 至少授予对应加载的文件的读取权限(例如 srt=o&sp=r)。 可以为不同的用例创建多个共享访问签名。 应按如下所示授予权限:

    操作 权限
    从文件中读取数据 读取
    从多个文件和子文件夹读取数据 读取和列出
    使用 Create External Table as Select (CETAS) 读取、创建、列出和写入
  • 对于第 2 代Azure Blob 存储和Azure Data Lake:

    • 允许的服务:必须选择 Blob 才能生成 SAS 令牌
  • 允许的资源类型:必须选择 ContainerObject 才能生成 SAS 令牌

有关将 CREDENTIAL 与 S3 兼容对象存储和 PolyBase 结合使用的示例,请参阅配置 PolyBase 以访问 S3 兼容对象存储中的外部数据

若要创建数据库范围的凭据,请参阅 CREATE DATABASE SCOPED CREDENTIAL

权限

需要对 SQL Server 中的数据库具有 CONTROL 权限。

锁定

EXTERNAL DATA SOURCE 对象采用共享锁。

安全性

PolyBase 支持大多数外部数据源的基于代理的身份验证。 创建数据库范围凭据以创建代理帐户。

升级到 SQL Server 2022

从 SQL Server 2022(16.x)开始,不再支持 Hadoop 外部数据源。 需要手动重新创建以前创建的 TYPE = HADOOP外部数据源以及使用此外部数据源的任何外部表。

用户还需要将外部数据源配置为在连接到Azure 存储时使用新连接器。

外部数据源 功能
Azure Blob 存储 wasb[s] abs
ADLS Gen2 abfs[s] adls

示例

重要

有关如何安装和启用 PolyBase 的信息,请参阅 WindowsInstall PolyBase>

答: 在 SQL Server 中创建外部数据源以引用 Oracle

要创建引用 Oracle 的外部数据源,请确保具有数据库范围凭据。 还可以选择对此数据源启用或禁用计算下推。

-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL OracleProxyAccount
WITH IDENTITY = 'oracle_username',
     SECRET = 'oracle_password';

CREATE EXTERNAL DATA SOURCE MyOracleServer
WITH (
    LOCATION = 'oracle://145.145.145.145:1521',
    PUSHDOWN = ON,
    CREDENTIAL = OracleProxyAccount
);

(可选)Oracle 的外部数据源可以使用代理身份验证提供精细的访问控制。 可以将代理用户配置为,与被模拟的用户相比,具有有限的访问权限。

CREATE DATABASE SCOPED CREDENTIAL [OracleProxyCredential]
WITH IDENTITY = 'oracle_username',
     SECRET = 'oracle_password';

CREATE EXTERNAL DATA SOURCE [OracleSalesSrvr]
WITH (
    LOCATION = 'oracle://145.145.145.145:1521',
    CONNECTION_OPTIONS = 'ImpersonateUser=%CURRENT_USER',
    CREDENTIAL = [OracleProxyCredential]
);

或者,可以使用 TNS 进行身份验证。

从 SQL Server 2022 (16.x) 累积更新 2 开始,CREATE EXTERNAL DATA SOURCE现在支持在连接到 Oracle 时使用 TNS 文件。

CONNECTION_OPTIONS 参数已扩展,现在使用 TNSNamesFileServerName 作为变量来浏览 tnsnames.ora 文件并与服务器建立连接。

在下面的示例中,在运行时SQL Server期间,将搜索由 TNSNamesFile 指定的 tnsnames.ora 文件位置,并搜索由 ServerName 指定的主机和网络端口。

CREATE EXTERNAL DATA SOURCE [external_data_source_name]
WITH (
    LOCATION = N'oracle://XE',
    CREDENTIAL = [OracleCredentialTest],
    CONNECTION_OPTIONS = N'TNSNamesFile=C:\Temp\tnsnames.ora;ServerName=XE'
);

B. 创建外部数据源以通过 PolyBase 连接引用SQL Server命名实例

应用到: SQL Server 2019 (15.x) 及更高版本

若要创建引用SQL Server命名实例的外部数据源,请使用 CONNECTION_OPTIONS 指定实例名称。

首先,创建数据库限定范围的凭据,为经过身份验证的 SQL 登录名存储凭据。 用于 PolyBase 的 SQL ODBC 连接器仅支持基本身份验证。 创建数据库范围凭据之前,数据库必须具有主密钥用于保护凭据。 有关详细信息,请参阅 CREATE MASTER KEY。 以下示例创建数据库限定范围的凭据,提供自己的登录名和密码。

CREATE DATABASE SCOPED CREDENTIAL SQLServerCredentials
WITH IDENTITY = 'username',
     SECRET = 'password';

在下面的示例中,WINSQL2019 是主机名,而 SQL2019 是实例名。 'Server=%s\SQL2019' 是键值对。

CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
    LOCATION = 'sqlserver://WINSQL2019',
    CONNECTION_OPTIONS = 'Server=%s\SQL2019',
    CREDENTIAL = SQLServerCredentials
);

或者,可以使用端口连接到SQL Server默认实例。

CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
    LOCATION = 'sqlserver://WINSQL2019:58137',
    CREDENTIAL = SQLServerCredentials
);

C. 创建外部数据源以引用 Always On 可用性组的可读次要副本

应用到: SQL Server 2019 (15.x) 及更高版本

若要创建引用 SQL Server 的可读次要副本的外部数据源,请使用 CONNECTION_OPTIONS 指定 ApplicationIntent=ReadOnly。 此外,需要将可用性数据库 Database={dbname} 设置为 in CONNECTION_OPTIONS,或将可用性数据库设置为用于数据库作用域凭据的登录名的默认数据库。 需要在可用性组的所有可用性副本上执行此作。

首先,创建数据库限定范围的凭据,为经过身份验证的 SQL 登录名存储凭据。 用于 PolyBase 的 SQL ODBC 连接器仅支持基本身份验证。 创建数据库范围凭据之前,数据库必须具有主密钥用于保护凭据。 有关详细信息,请参阅 CREATE MASTER KEY。 以下示例创建数据库限定范围的凭据,提供自己的登录名和密码。

CREATE DATABASE SCOPED CREDENTIAL SQLServerCredentials
WITH IDENTITY = 'username',
     SECRET = 'password';

接下来,创建新的外部数据源。

无论是在Database=dbnameCONNECTION_OPTIONS数据库范围内凭据中包括可用性数据库还是将可用性数据库设置为登录名的默认数据库,仍必须在 LOCATION 参数中通过 CREATE EXTERNAL TABLE 语句中的三部分名称提供数据库名称。 有关示例,请参阅 CREATE EXTERNAL TABLE

在下面的示例中,WINSQL2019AGL 是可用性组侦听程序名称,dbname 是要成为 CREATE EXTERNAL TABLE 语句目标的数据库的名称。

CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
    LOCATION = 'sqlserver://WINSQL2019AGL',
    CONNECTION_OPTIONS = 'ApplicationIntent=ReadOnly; Database=dbname',
    CREDENTIAL = SQLServerCredentials
);

可以通过在系统视图 ApplicationIntent 上指定 sys.servers 并创建外部表来演示可用性组的重定向行为。 在以下示例脚本中,会创建两个外部数据源,并为每个外部数据源创建一个外部表。 使用视图测试哪个服务器在响应连接。 还可以通过只读路由功能实现类似结果。 有关详细信息,请参阅为 Always On 可用性组配置只读路由

CREATE EXTERNAL DATA SOURCE [DataSource_SQLInstanceListener_ReadOnlyIntent]
WITH (
    LOCATION = 'sqlserver://WINSQL2019AGL',
    CONNECTION_OPTIONS = 'ApplicationIntent=ReadOnly; Database=dbname',
    CREDENTIAL = [SQLServerCredentials]
);
GO

CREATE EXTERNAL DATA SOURCE [DataSource_SQLInstanceListener_ReadWriteIntent]
WITH (
    LOCATION = 'sqlserver://WINSQL2019AGL',
    CONNECTION_OPTIONS = 'ApplicationIntent=ReadWrite',
    CREDENTIAL = [SQLServerCredentials]
);
GO

在可用性组的数据库内,创建视图以返回 sys.servers 和本地实例的名称,这可帮助确定哪个副本在响应查询。 有关详细信息,请参阅 sys.servers

CREATE VIEW vw_sys_servers
AS
SELECT [name]
FROM sys.servers
WHERE server_id = 0;
GO

然后,在源实例上创建外部表:

CREATE EXTERNAL TABLE vw_sys_servers_ro (name SYSNAME NOT NULL)
WITH (
    DATA_SOURCE = [DataSource_SQLInstanceListener_ReadOnlyIntent],
    LOCATION = N'dbname.dbo.vw_sys_servers'
);
GO

CREATE EXTERNAL TABLE vw_sys_servers_rw (name SYSNAME NOT NULL)
WITH (
    DATA_SOURCE = [DataSource_SQLInstanceListener_ReadWriteIntent],
    LOCATION = N'dbname.dbo.vw_sys_servers'
);
GO

SELECT [name]
FROM dbo.vw_sys_servers_ro;--should return secondary replica instance

SELECT [name]
FROM dbo.vw_sys_servers_rw;--should return primary replica instance
GO

D. 通过 PolyBase 创建外部数据源以查询 S3 兼容对象存储中的 parquet 文件

Applies to: SQL Server 2022 (16.x) 及更高版本

以下示例脚本在SQL Server的源用户数据库中创建一个外部数据源s3_ds。 外部数据源引用 s3_dc 数据库范围的凭据。

CREATE DATABASE SCOPED CREDENTIAL s3_dc
WITH IDENTITY = 'S3 Access Key', -- for S3-compatible object storage the identity must always be S3 Access Key
    SECRET = '<access_key_id>:<secret_key_id>' -- provided by the S3-compatible object storage
GO

CREATE EXTERNAL DATA SOURCE s3_ds
WITH (
    LOCATION = 's3://<ip_address>:<port>/',
    CREDENTIAL = s3_dc
);
GO

使用 sys.external_data_sources 验证新的外部数据源。

SELECT *
FROM sys.external_data_sources;

然后,以下示例演示如何使用 T-SQL 通过 OPENROWSET 查询来查询存储在 S3 兼容的对象存储中的 parquet 文件。 有关详细信息,请参阅使用 PolyBase 虚拟化 S3 兼容对象存储中的 parquet 文件

SELECT *
FROM OPENROWSET (
    BULK '/<bucket>/<parquet_folder>',
    FORMAT = 'PARQUET',
    DATA_SOURCE = 's3_ds'
) AS [cc];

E. 使用泛型 ODBC 创建到 PostgreSQL 的外部数据源

与前面示例一样,先创建数据库主密钥和数据库范围凭据。 数据库范围的凭据将用于外部数据源。 此示例还假定服务器上安装了适用于 PostgreSQL 的泛型 ODBC 数据提供程序。

在本例中,泛型 ODBC 数据提供程序用于连接到同一网络中的 PostgreSQL 数据库服务器,其中 PostgreSQL 服务器的完全限定域名为 POSTGRES1,使用的默认端口是 TCP 5432。

CREATE EXTERNAL DATA SOURCE POSTGRES1
WITH (
    LOCATION = 'odbc://POSTGRES1.domain:5432',
    CONNECTION_OPTIONS = 'Driver={PostgreSQL Unicode(x64)};',
    CREDENTIAL = postgres_credential
);

Azure 存储

创建共享访问签名

对于 Azure Blob 存储 和 Azure Data Lake Storage (ADLS) Gen2,支持的身份验证方法是共享访问签名(SAS)。 生成共享访问签名令牌的一种简单方法,请执行以下步骤。 有关详细信息,请参阅凭据

  1. 导航到Azure门户和所需的存储帐户。

  2. 导航到“数据存储”菜单下的所需容器。

  3. 选择“共享访问令牌”。

  4. 根据所需作选择适当的权限:

    操作 权限
    从文件中读取数据 读取
    从多个文件和子文件夹读取数据 读取和列出
    使用 Create External Table as Select (CETAS) 读取、创建和写入
  5. 选择令牌的过期日期。

  6. 生成 SAS 令牌和 URL。

  7. 复制 SAS 令牌。

F. 使用 abs:// 接口创建外部数据源以访问Azure Blob 存储中的数据

Applies to: SQL Server 2022 (16.x) 及更高版本

从 SQL Server 2022(16.x)开始,对 Azure 存储 Account v2 使用新的前缀 absabs 前缀支持使用 SHARED ACCESS SIGNATURE 进行身份验证。 abs 前缀替换了以前版本中使用的 wasb。 不再支持 HADOOP,不再需要使用 TYPE = BLOB_STORAGE

不再需要Azure存储帐户密钥,而是使用 SAS 令牌,如以下示例所示:

-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO

CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredentialv2
WITH IDENTITY = 'SHARED ACCESS SIGNATURE', -- to use SAS the identity must be fixed as-is
    SECRET = '<Blob_SAS_Token>';
GO

-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
    LOCATION = 'abs://<container>@<storage_account_name>.blob.core.windows.net/',
    CREDENTIAL = AzureStorageCredentialv2
);

有关如何访问存储在Azure Blob 存储中的 CSV 文件的更详细示例,请参阅使用 PolyBase 将 CSV 文件虚拟化

G. 创建外部数据源以访问 Azure Data Lake Gen2 中的数据

应用到: SQL Server 2022(16.x)及更高版本

从 SQL Server 2022 (16.x)开始,对 Azure Data Lake Gen2 使用新的前缀 adls,替换以前版本中使用的 abfs。 前缀 adls 还支持将 SAS 令牌作为身份验证方法,如此示例所示:

--Create a database scoped credential using SAS Token
CREATE DATABASE SCOPED CREDENTIAL datalakegen2
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
     SECRET = '<DataLakeGen2_SAS_Token>';
GO

CREATE EXTERNAL DATA SOURCE data_lake_gen2_dfs
WITH (
    LOCATION = 'adls://<container>@<storage_account>.dfs.core.windows.net',
    CREDENTIAL = datalakegen2
);

有关如何访问存储在 Azure Data Lake Gen2 上的增量文件的更详细示例,请参阅 使用 PolyBase 虚拟化增量表

示例:批量操作

重要

在为批量作配置外部数据源时,不要在 URL 末尾/添加尾随LOCATION、文件名或共享访问签名参数。

H. 为从Azure 存储检索数据的批量操作创建外部数据源

Applies to: SQL Server 2022 (16.x) 及更高版本。

使用以下数据源通过 BULK INSERTOPENROWSET BULK 执行批量作。 凭据必须设置 SHARED ACCESS SIGNATURE 作为标识、不应在 SAS 令牌中具有前导 ?、必须对应加载的文件(例如 srt=o&sp=r)至少具有读取权限,并且有效期应有效(所有日期均采用 UTC 时间)。 有关共享访问签名的详细信息,请参阅使用共享访问签名 (SAS)

CREATE DATABASE SCOPED CREDENTIAL AccessAzureInvoices
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
    -- Remove ? from the beginning of the SAS token
    SECRET = '<azure_shared_access_signature>';

CREATE EXTERNAL DATA SOURCE MyAzureInvoices
WITH (
    LOCATION = 'abs://<container>@<storage_account_name>.blob.core.windows.net/',
    CREDENTIAL = AccessAzureInvoices,
);

概述:SQL Server 2025

应用到:SQL Server 2025 (17.x)

为 PolyBase 查询创建外部数据源。 外部数据源用于建立连接以及支持以下这些用例:

  • 在 SQL ServerPolyBase 进行数据虚拟化和数据加载>
  • 使用 BULK INSERTOPENROWSET 大容量加载操作

支持通过Azure Arc启用的实例的托管标识连接。有关详细信息,请查看 Connect,以便从 PolyBase 使用托管标识Azure 存储

注意

的语法因 SQL 数据库引擎。 使用版本选择器下拉列表 选择相应的产品版本。 此内容适用于 SQL Server 2025(17.x)及更高版本。

SQL Server 2025 及更高版本的语法

有关语法约定的详细信息,请参阅 Transact-SQL 语法约定

CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
  ( [ LOCATION = '<prefix>://<path>[:<port>]' ]
    [ [ , ] CONNECTION_OPTIONS = '<key_value_pairs>'[,...]]
    [ [ , ] CREDENTIAL = <credential_name> ]
    [ [ , ] PUSHDOWN = { ON | OFF } ]
  )
[ ; ]

参数

data_source_name

指定数据源的用户定义名称。 该名称在SQL Server中的数据库中必须唯一。

LOCATION = '<prefix>://<path[:p ort]>'

提供连接协议和外部数据源的路径。

外部数据源 连接器位置前缀 位置路径 产品/服务支持的位置 身份验证
Azure 存储帐户(V2) abs abs://<container_name>@<storage_account_name>.blob.core.windows.net/

abs://<storage_account_name>.blob.core.windows.net/<container_name>
从 SQL Server 2022 (16.x) 开始
支持分层命名空间。
共享访问签名 (SAS)

PolyBase 对托管标识的支持Azure 存储1
Azure Data Lake Storage Gen2 adls adls://<container_name>@<storage_account_name>.dfs.core.windows.net/

adls://<storage_account_name>.dfs.core.windows.net/<container_name>
从 SQL Server 2022 (16.x) 开始 共享访问签名 (SAS)

PolyBase 对托管标识的支持Azure 存储1
SQL Server sqlserver <server_name>[\<instance_name>][:port] 从 SQL Server 2019 (15.x) 开始 仅 SQL 身份验证
神谕 oracle <server_name>[:port] 从 SQL Server 2019 (15.x) 开始 仅基本身份验证
Teradata teradata <server_name>[:port] 从 SQL Server 2019 (15.x) 开始 仅基本身份验证
MongoDB 或 Cosmos DB API for MongoDB mongodb <server_name>[:port] 从 SQL Server 2019 (15.x) 开始 仅基本身份验证
泛型 ODBC odbc <server_name>[:port] 从 SQL Server 2019 (15.x) 开始 - 仅Windows 仅基本身份验证
批量操作 https <storage_account>.blob.core.windows.net/<container> 从 SQL Server 2017 (14.x) 开始 共享访问签名 (SAS)
S3 兼容的对象存储 s3 - S3 兼容: s3://<server_name>:<port>/
- AWS S3: s3://<bucket_name>.S3.amazonaws.com[:port]/<folder>
s3://s3.amazonaws.com[:port]/<bucket_name>/<folder>
从 SQL Server 2022 (16.x) 开始 基本或直通 (STS) 2

1需要SQL Server 2025 (17.x) 实例,Azure Arc启用。有关详细信息,请查看 Connect 以使用 PolyBase 的托管标识Azure 存储

2 必须是 数据库范围的凭据,其中 IDENTITY 硬编码, IDENTITY = 'S3 Access Key' 参数 SECRET 采用格式 = '<AccessKeyID>:<SecretKeyID>' 或使用直通 (STS) 授权。 有关详细信息,请参阅配置 PolyBase 以访问 S3 兼容的对象存储中的外部数据

位置路径:

位置路径 DESCRIPTION
port 外部数据源正在侦听的端口。 在许多情况下(具体取决于网络配置)是可选的。
<container_name> 保存数据的存储帐户的容器。 根容器是只读的,数据无法写回容器。
<storage_account> Azure资源的存储帐户名称。
<server_name> 主机名。
<instance_name> 命名实例SQL Server的名称。 如果在目标实例上运行SQL Server浏览器服务,则使用。
<ip_address>:<port> 1 对于仅与 S3 兼容的对象存储,用于连接到 S3 兼容的存储的终结点和端口。
<bucket_name> 1 仅适用于与 S3 兼容的对象存储,特定于存储平台。
<region> 1 仅适用于与 S3 兼容的对象存储,特定于存储平台。
<folder> 存储 URL 中的存储路径的一部分。

1 SQL Server 2022(16.x)及更高版本。

设置位置时的其他说明和指南:

  • 创建对象时,SQL Server 数据库引擎不会验证外部数据源是否存在。 要进行验证,请使用外部数据源创建外部表。

  • 可以使用 sqlserver 连接器将 SQL Server 2019 (15.x) 连接到另一个SQL Server或Azure SQL 数据库。

  • 通过 Driver={<Name of Driver>} 连接时,请指定 ODBC

  • SQL Server 2022(16.x)及更高版本中,支持使用前缀 adls 的分层命名空间 Azure 存储帐户选项Azure Data Lake Storage Gen2。

  • SQL SERVER对 HDFS Cloudera (CDP) 和 Hortonworks (HDP) 外部数据源的支持已停用,且未包含在 SQL Server 2022(16.x)及更高版本中。 无需在 2025 SQL Server (17.x) 中使用 TYPE 参数。

  • 有关 SQL Server 2022(16.x)及更高版本中与 S3 兼容的对象存储和 PolyBase 的详细信息,请参阅 Configure PolyBase 以访问 S3 兼容对象存储中的外部数据。 有关在 S3 兼容对象存储中查询 parquet 文件的示例,请参阅使用 PolyBase 虚拟化 S3 兼容对象存储中的 parquet 文件

在 SQL Server 2022(16.x)及更高版本中:

  • 用于Azure 存储帐户(v2)的前缀已从 wasb[s] 更改为 abs

  • 用于Azure Data Lake Storage Gen2的前缀已从 abfs[s] 更改为 adls

  • 有关使用 PolyBase 在 Azure 存储 中虚拟化 CSV 文件的示例,请参阅 使用 PolyBase 虚拟化 CSV 文件

  • 有关使用 PolyBase 在 ADLS Gen2 中虚拟化 Delta 表的示例,请参阅使用 PolyBase 虚拟化 Delta 表

  • SQL Server 2022(16.x)和更高版本完全支持 Azure 存储 帐户 v2(abs)和 Azure Data Lake Gen2(adls)的两种 URL 格式。

    • 路径 LOCATION 可以使用格式: <container>@<storage_account_name>.. (建议)或 <storage_account_name>../<container>。 例如:

      • Azure 存储帐户 v2:abs://<container>@<storage_account_name>.blob.core.windows.net(建议)或 abs://<storage_account_name>.blob.core.windows.net/<container>
  • Azure Data Lake Gen2 支持:adls://<container>@<storage_account_name>.blob.core.windows.net(建议)或 adls://<storage_account_name>.dfs.core.windows.net/<container>

CONNECTION_OPTIONS = key_value_pair

应用到:SQL Server 2019(15.x)及更高版本。

通过 ODBC 连接到外部数据源时指定其他选项。 若要使用多个连接选项,请用分号分隔它们。

适用于泛型 ODBC 连接,以及适用于 SQL Server、Oracle、Teradata、MongoDB 和 Azure Cosmos DB API 的内置 ODBC 连接器。

key_value_pair 是特定连接选项的关键字和值。 哪些关键字和值可用由外部数据源类型决定。 驱动程序的名称是必需的(最基本的要求),但设置其他选项(例如 APP='<your_application_name>'ApplicationIntent= ReadOnly|ReadWrite)也很有用,可以帮助进行故障排除。

可能的键值对特定于驱动程序。 有关每个提供程序的详细信息,请参阅 CREATE EXTERNAL DATA SOURCE (Transact-SQL) CONNECTION_OPTIONS

从 2022 年 SQL Server (16.x) 累积更新 2 开始,引入了其他关键字以支持 Oracle TNS 文件:

  • 关键字 TNSNamesFile 指定位于 Oracle 服务器上的 tnsnames.ora 文件的文件路径。
  • 关键字 ServerName 指定 tnsnames.ora 内使用的别名,该别名将用于替换主机名和端口。

2025 SQL Server(17.x)

从 SQL Server 2025 (17.x)开始,使用 sqlserver 作为数据源时,Microsoft ODBC 驱动程序版本 18 for SQL Server 是默认驱动程序。 该Encryption选项是必需的(Yes、或NoStrict),并且TrustServerCertificate可用(YesNo)。 如果未 Encryption 指定,则默认行为为 Encrypt=Yes;TrustServerCertificate=No;,并且需要服务器证书。

若要使用 TDS 8.0 协议进行连接,已添加严格模式(Encrypt=Strict)。 在此模式下,需要安装受信任的服务器证书,并且始终经过验证(忽略 TrustServerCertificate)。 如果新关键字 HostnameInCertificate 与指定的服务器不同,则可用于指定在证书中找到的预期主机名。 HostnameInCertificate 在所有加密模式下都可用,并且如果启用了服务器端 强制加密 选项,这将导致驱动程序在 可选 模式或 强制 模式下验证证书,除非使用 TrustServerCertificate禁用。

有关 选项、服务器证书和 的详细信息,请参阅 Windows>Features。

应始终使用最新的驱动程序。 但是,SQL Server 2025(17.x)还支持 Microsoft ODBC 驱动程序版本 17,以实现向后兼容性SQL Server。 有关如何更改 PolyBase 使用的驱动程序版本的详细信息,请参阅 更改 PolyBase 的 SQL Server 驱动程序版本

PUSHDOWN = 打开 | 关闭

应用到:SQL Server 2019(15.x)及更高版本。

说明是否可以将计算下推到外部数据源。 默认启用。

连接到外部数据源级别的 SQL Server、Oracle、Teradata、MongoDB、Azure Cosmos DB API for MongoDB 或 ODBC 时,支持 PUSHDOWN

通过提示实现在查询级别启用或禁用下推。

CREDENTIAL = credential_name

指定用于对外部数据源进行身份验证的数据库范围凭据。

创建凭证时的其他说明和指导:

创建共享访问签名的方式有很多种:

  • 可以通过导航到 Azure 门户Your_Storage_Account>配置权限Generate SAS 和 连接字符串。 有关详细信息,请参阅生成共享访问签名

  • 可以使用 Azure 存储资源管理器 创建和配置 SAS

  • 可以通过 PowerShell、Azure CLI、.NET 和 REST API 以编程方式创建 SAS 令牌。 有关详细信息,请参阅 使用共享访问签名 (SAS) 限制对Azure 存储资源的访问权限。

  • 应按如下所示配置 SAS 令牌:

    • 生成 SAS 令牌时,它会在令牌开头包含问号('?')。 ?在配置为 SECRET..

    • 使用有效的有效期(所有日期均采用 UTC 时间)。

  • 至少授予对应加载的文件的读取权限(例如 srt=o&sp=r)。 可以为不同的用例创建多个共享访问签名。 应按如下所示授予权限:

    操作 权限
    从文件中读取数据 读取
    从多个文件和子文件夹读取数据 读取和列出
    使用 Create External Table as Select (CETAS) 读取、创建、列出和写入
  • 对于第 2 代Azure Blob 存储和Azure Data Lake:

    • 允许的服务:必须选择 Blob 才能生成 SAS 令牌
  • 允许的资源类型:必须选择 ContainerObject 才能生成 SAS 令牌

有关将 CREDENTIAL 与 S3 兼容对象存储和 PolyBase 结合使用的示例,请参阅配置 PolyBase 以访问 S3 兼容对象存储中的外部数据

若要创建数据库范围的凭据,请参阅 CREATE DATABASE SCOPED CREDENTIAL

权限

需要对 SQL Server 中的数据库具有 CONTROL 权限。

锁定

EXTERNAL DATA SOURCE 对象采用共享锁。

安全性

PolyBase 支持大多数外部数据源的基于代理的身份验证。 创建数据库范围凭据以创建代理帐户。

升级到 SQL Server 2025

在 SQL Server 2022(16.x)及更高版本中,不支持 Hadoop 外部数据源。 需要手动重新创建以前创建的 TYPE = HADOOP外部数据源以及使用此外部数据源的任何外部表。

用户还需要将外部数据源配置为在连接到Azure 存储时使用新连接器。

外部数据源 功能
Azure Blob 存储 wasb[s] 腹肌
ADLS Gen2 abfs[s] adls

示例

重要

有关如何安装和启用 PolyBase 的信息,请参阅 Windows 上的 Install PolyBase。

答: 在 SQL Server 中创建外部数据源以引用 Oracle

要创建引用 Oracle 的外部数据源,请确保具有数据库范围凭据。 还可以选择对此数据源启用或禁用计算下推。

-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL OracleProxyAccount
WITH IDENTITY = 'oracle_username',
     SECRET = 'oracle_password';

CREATE EXTERNAL DATA SOURCE MyOracleServer
WITH (
    LOCATION = 'oracle://145.145.145.145:1521',
    PUSHDOWN = ON,
    CREDENTIAL = OracleProxyAccount
);

(可选)Oracle 的外部数据源可以使用代理身份验证提供精细的访问控制。 可以将代理用户配置为,与被模拟的用户相比,具有有限的访问权限。

CREATE DATABASE SCOPED CREDENTIAL [OracleProxyCredential]
WITH IDENTITY = 'oracle_username',
     SECRET = 'oracle_password';

CREATE EXTERNAL DATA SOURCE [OracleSalesSrvr]
WITH (
    LOCATION = 'oracle://145.145.145.145:1521',
    CONNECTION_OPTIONS = 'ImpersonateUser=%CURRENT_USER',
    CREDENTIAL = [OracleProxyCredential]
);

或者,可以使用 TNS 进行身份验证。

从 SQL Server 2022 (16.x) 累积更新 2 开始,CREATE EXTERNAL DATA SOURCE现在支持在连接到 Oracle 时使用 TNS 文件。

CONNECTION_OPTIONS 参数已扩展,现在使用 TNSNamesFileServerName 作为变量来浏览 tnsnames.ora 文件并与服务器建立连接。

在下面的示例中,在运行时SQL Server期间,将搜索由 TNSNamesFile 指定的 tnsnames.ora 文件位置,并搜索由 ServerName 指定的主机和网络端口。

CREATE EXTERNAL DATA SOURCE [external_data_source_name]
WITH (
    LOCATION = N'oracle://XE',
    CREDENTIAL = [OracleCredentialTest],
    CONNECTION_OPTIONS = N'TNSNamesFile=C:\Temp\tnsnames.ora;ServerName=XE'
);

B. 创建外部数据源以通过 PolyBase 连接引用SQL Server命名实例

应用到: SQL Server 2019(15.x)及更高版本。

若要创建引用SQL Server命名实例的外部数据源,请使用 CONNECTION_OPTIONS 指定实例名称。

首先,创建数据库限定范围的凭据,为经过身份验证的 SQL 登录名存储凭据。 用于 PolyBase 的 SQL ODBC 连接器仅支持基本身份验证。 创建数据库范围凭据之前,数据库必须具有主密钥用于保护凭据。 有关详细信息,请参阅 CREATE MASTER KEY。 以下示例创建数据库限定范围的凭据,提供自己的登录名和密码。

CREATE DATABASE SCOPED CREDENTIAL SQLServerCredentials
WITH IDENTITY = 'username',
     SECRET = 'password';

在下面的示例中,WINSQL2019 是主机名,而 SQL2019 是实例名。 'Server=%s\SQL2019' 是键值对。

CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
    LOCATION = 'sqlserver://WINSQL2019',
    CONNECTION_OPTIONS = 'Server=%s\SQL2019',
    CREDENTIAL = SQLServerCredentials
);

或者,可以使用端口连接到SQL Server默认实例。

CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
    LOCATION = 'sqlserver://WINSQL2019:58137',
    CREDENTIAL = SQLServerCredentials
);

C. 创建外部数据源以引用 Always On 可用性组的可读次要副本

应用到: SQL Server 2019(15.x)及更高版本。

若要创建引用 SQL Server 的可读次要副本的外部数据源,请使用 CONNECTION_OPTIONS 指定 ApplicationIntent=ReadOnly。 此外,需要将可用性数据库 Database={dbname} 设置为 in CONNECTION_OPTIONS,或者将可用性数据库设置为用于数据库作用域凭据的登录名的默认数据库。 需要在可用性组的所有可用性副本上执行此作。

首先,创建数据库限定范围的凭据,为经过身份验证的 SQL 登录名存储凭据。 用于 PolyBase 的 SQL ODBC 连接器仅支持基本身份验证。 创建数据库范围凭据之前,数据库必须具有主密钥用于保护凭据。 有关详细信息,请参阅 CREATE MASTER KEY。 以下示例创建数据库限定范围的凭据,提供自己的登录名和密码。

CREATE DATABASE SCOPED CREDENTIAL SQLServerCredentials
WITH IDENTITY = 'username',
     SECRET = 'password';

接下来,创建新的外部数据源。

无论是在Database=dbnameCONNECTION_OPTIONS数据库范围内凭据中包括可用性数据库还是将可用性数据库设置为登录名的默认数据库,仍必须在 LOCATION 参数中通过 CREATE EXTERNAL TABLE 语句中的三部分名称提供数据库名称。 有关示例,请参阅 CREATE EXTERNAL TABLE

在下面的示例中,WINSQL2019AGL 是可用性组侦听程序名称,dbname 是要成为 CREATE EXTERNAL TABLE 语句目标的数据库的名称。

CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
    LOCATION = 'sqlserver://WINSQL2019AGL',
    CONNECTION_OPTIONS = 'ApplicationIntent=ReadOnly; Database=dbname',
    CREDENTIAL = SQLServerCredentials
);

可以通过在系统视图 ApplicationIntent 上指定 sys.servers 并创建外部表来演示可用性组的重定向行为。 在以下示例脚本中,会创建两个外部数据源,并为每个外部数据源创建一个外部表。 使用视图测试哪个服务器在响应连接。 还可以通过只读路由功能实现类似结果。 有关详细信息,请参阅为 Always On 可用性组配置只读路由

CREATE EXTERNAL DATA SOURCE [DataSource_SQLInstanceListener_ReadOnlyIntent]
WITH (
    LOCATION = 'sqlserver://WINSQL2019AGL',
    CONNECTION_OPTIONS = 'ApplicationIntent=ReadOnly; Database=dbname',
    CREDENTIAL = [SQLServerCredentials]
);
GO

CREATE EXTERNAL DATA SOURCE [DataSource_SQLInstanceListener_ReadWriteIntent]
WITH (
    LOCATION = 'sqlserver://WINSQL2019AGL',
    CONNECTION_OPTIONS = 'ApplicationIntent=ReadWrite',
    CREDENTIAL = [SQLServerCredentials]
);
GO

在可用性组的数据库内,创建视图以返回 sys.servers 和本地实例的名称,这可帮助确定哪个副本在响应查询。 有关详细信息,请参阅 sys.servers

CREATE VIEW vw_sys_servers AS
    SELECT [name]
    FROM sys.servers
    WHERE server_id = 0;
GO

然后,在源实例上创建外部表:

CREATE EXTERNAL TABLE vw_sys_servers_ro
(
    name SYSNAME NOT NULL
)
WITH (
    DATA_SOURCE = [DataSource_SQLInstanceListener_ReadOnlyIntent],
    LOCATION = N'dbname.dbo.vw_sys_servers'
);
GO

CREATE EXTERNAL TABLE vw_sys_servers_rw
(
    name SYSNAME NOT NULL
)
WITH (
    DATA_SOURCE = [DataSource_SQLInstanceListener_ReadWriteIntent],
    LOCATION = N'dbname.dbo.vw_sys_servers'
);
GO

SELECT [name]
FROM dbo.vw_sys_servers_ro;
--should return secondary replica instance

SELECT [name]
FROM dbo.vw_sys_servers_rw;
--should return primary replica instance
GO

D. 通过 PolyBase 创建外部数据源以查询 S3 兼容对象存储中的 parquet 文件

Applies to: SQL Server 2022 (16.x) 及更高版本。

以下示例脚本在SQL Server的源用户数据库中创建一个外部数据源s3_ds。 外部数据源引用 s3_dc 数据库范围的凭据。

CREATE DATABASE SCOPED CREDENTIAL s3_dc
WITH IDENTITY = 'S3 Access Key', -- for S3-compatible object storage the identity must always be S3 Access Key
    SECRET = '<access_key_id>:<secret_key_id>'; -- provided by the S3-compatible object storage
GO

CREATE EXTERNAL DATA SOURCE s3_ds
WITH (
    LOCATION = 's3://<ip_address>:<port>/',
    CREDENTIAL = s3_dc
);
GO

使用 sys.external_data_sources 验证新的外部数据源。

SELECT *
FROM sys.external_data_sources;

然后,以下示例演示如何使用 T-SQL 通过 OPENROWSET 查询来查询存储在 S3 兼容的对象存储中的 parquet 文件。 有关详细信息,请参阅使用 PolyBase 虚拟化 S3 兼容对象存储中的 parquet 文件

SELECT *
FROM OPENROWSET (
    BULK '/<bucket>/<parquet_folder>',
    FORMAT = 'PARQUET',
    DATA_SOURCE = 's3_ds'
) AS [cc];

E. 使用泛型 ODBC 创建到 PostgreSQL 的外部数据源

与前面示例一样,先创建数据库主密钥和数据库范围凭据。 数据库范围的凭据将用于外部数据源。 此示例还假定服务器上安装了适用于 PostgreSQL 的泛型 ODBC 数据提供程序。

在本例中,泛型 ODBC 数据提供程序用于连接到同一网络中的 PostgreSQL 数据库服务器,其中 PostgreSQL 服务器的完全限定域名为 POSTGRES1,使用的默认端口是 TCP 5432。

CREATE EXTERNAL DATA SOURCE POSTGRES1
WITH (
    LOCATION = 'odbc://POSTGRES1.domain:5432',
    CONNECTION_OPTIONS = 'Driver={PostgreSQL Unicode(x64)};',
    CREDENTIAL = postgres_credential
);

Azure 存储

创建共享访问签名

对于 Azure Blob 存储 和 Azure Data Lake Gen2,支持的身份验证方法是共享访问签名(SAS)。 生成共享访问签名令牌的一种简单方法,请执行以下步骤。 有关详细信息,请参阅凭据

  1. 导航到Azure门户和所需的存储帐户。
  2. 导航到“数据存储”菜单下的所需容器。
  3. 选择“共享访问令牌”。
  4. 根据所需作选择适当的权限。 有关参考,请使用下表:
操作 权限
从文件中读取数据 读取
从多个文件和子文件夹读取数据 读取和列出
使用 Create External Table as Select (CETAS) 读取、创建和写入
  1. 选择令牌的过期日期。
  2. 生成 SAS 令牌和 URL。
  3. 复制 SAS 令牌。

F. 使用 abs:// 接口创建外部数据源以访问Azure Blob 存储中的数据

Applies to: SQL Server 2022 (16.x) 及更高版本。

对 Azure 存储 Account v2 使用新的前缀 absabs 前缀支持使用 SHARED ACCESS SIGNATURE 进行身份验证。 abs 前缀替换了以前版本中使用的 wasb。 不再支持 HADOOP,不再需要使用 TYPE = BLOB_STORAGE

不再需要Azure存储帐户密钥,而是使用 SAS 令牌,如以下示例所示:

-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD= '<password>';
GO

CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredentialv2
WITH IDENTITY = 'SHARED ACCESS SIGNATURE', -- to use SAS the identity must be fixed as-is
    SECRET = '<Blob_SAS_Token>';
GO

-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
    LOCATION = 'abs://<container>@<storage_account_name>.blob.core.windows.net/',
    CREDENTIAL = AzureStorageCredentialv2
);

有关如何访问存储在Azure Blob 存储中的 CSV 文件的更详细示例,请参阅使用 PolyBase 将 CSV 文件虚拟化

G. 创建外部数据源以访问 Azure Data Lake Gen2 中的数据

Applies to: SQL Server 2022 (16.x) 及更高版本。

对 Azure Data Lake Gen2 使用新的前缀 adls,替换以前版本中使用的 abfs。 前缀 adls 还支持将 SAS 令牌作为身份验证方法,如此示例所示:

--Create a database scoped credential using SAS Token
CREATE DATABASE SCOPED CREDENTIAL datalakegen2
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
     SECRET = '<DataLakeGen2_SAS_Token>';
GO

CREATE EXTERNAL DATA SOURCE data_lake_gen2_dfs
WITH (
    LOCATION = 'adls://<container>@<storage_account>.dfs.core.windows.net',
    CREDENTIAL = datalakegen2
);

有关如何访问存储在 Azure Data Lake Gen2 上的增量文件的更详细示例,请参阅 使用 PolyBase 虚拟化增量表

示例:批量操作

重要

在为批量作配置外部数据源时,不要在 URL 末尾/添加尾随LOCATION、文件名或共享访问签名参数。

H. 为从Azure 存储检索数据的批量操作创建外部数据源

Applies to: SQL Server 2022 (16.x) 及更高版本。

对使用 BULK INSERTOPENROWSET 的批量操作使用以下数据源。 凭据必须设置 SHARED ACCESS SIGNATURE 作为标识、不应在 SAS 令牌中具有前导 ?、必须对应加载的文件(例如 srt=o&sp=r)至少具有读取权限,并且有效期应有效(所有日期均采用 UTC 时间)。 有关共享访问签名的详细信息,请参阅使用共享访问签名 (SAS)

CREATE DATABASE SCOPED CREDENTIAL AccessAzureInvoices
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
    -- Remove ? from the beginning of the SAS token
    SECRET = '<azure_shared_access_signature>';

CREATE EXTERNAL DATA SOURCE MyAzureInvoices
WITH (
    LOCATION = 'abs://<container>@<storage_account_name>.blob.core.windows.net/',
    CREDENTIAL = AccessAzureInvoices,
);

一。 使用 TDS 8.0 创建外部数据源以与其他SQL Server

应用到:SQL Server 2025(17.x)及更高版本。

使用最新的 Microsoft ODBC Driver 18 for SQL Server 时,必须使用 CONNECTION_OPTIONS 下的 Encryption 选项,并且还支持 TrustServerCertificate。 如果未 Encryption 指定,则默认行为为 Encrypt=Yes;TrustServerCertificate=No;,并且需要服务器证书。

在此示例中,使用 SQL 身份验证。 若要保护凭据,需要数据库主密钥(DMK)。 有关详细信息,请参阅 CREATE MASTER KEY。 以下示例使用自定义登录名和密码创建数据库范围的凭据。

CREATE DATABASE SCOPED CREDENTIAL SQLServerCredentials
WITH IDENTITY = '<username>',
     SECRET = '<password>';

目标服务器名称为 WINSQL2022端口 58137,它是默认实例。 通过指定 Encrypt=Strict,连接使用 TDS 8.0,并且服务器证书始终得到验证。 在此示例中, HostnameinCertificate 使用的值为 WINSQL2022

CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
    LOCATION = 'sqlserver://WINSQL2022:58137',
    CONNECTION_OPTIONS = 'Encrypt=Strict;HostnameInCertificate=WINSQL2022;'
    CREDENTIAL = SQLServerCredentials
);

J. 使用加密和 TrustServerCertificate 选项创建外部数据源

在前面的示例中,有两个代码示例。 第一个代码片段具有 EncryptionTrustServerCertificate 设置。

CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
    LOCATION = 'sqlserver://WINSQL2022:58137',
    CONNECTION_OPTIONS = 'Encrypt=Yes;HostnameInCertificate=WINSQL2022;TrustServerCertificate=Yes;'
    CREDENTIAL = SQLServerCredentials
);

以下代码片段未 Encryption 启用。

CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
    LOCATION = 'sqlserver://WINSQL2022:58137',
    CONNECTION_OPTIONS = 'Encrypt=no;'
    CREDENTIAL = SQLServerCredentials
);

* SQL 数据库 *  

 

概述:Azure SQL 数据库

应用到:Azure SQL 数据库

为弹性查询创建外部数据源。 外部数据源用于建立连接以及支持以下这些用例:

Transact-SQL语法约定

语法

CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
  ( [ LOCATION = '<prefix>://<path>[:<port>]' ]
    [ [ , ] CREDENTIAL = <credential_name> ]
    [ [ , ] TYPE = { BLOB_STORAGE | RDBMS | SHARD_MAP_MANAGER } ]
    [ [ , ] DATABASE_NAME = '<database_name>' ]
    [ [ , ] SHARD_MAP_NAME = '<shard_map_manager>' ] )
[ ; ]

参数

data_source_name

指定数据源的用户定义名称。 该名称在 SQL 数据库中必须是唯一的。

LOCATION = '<prefix>://<path[:p ort]>'

提供连接协议和外部数据源的路径。

外部数据源 连接器位置前缀 位置路径 可用性
批量操作 https <storage_account>.blob.core.windows.net/<container>
弹性查询(分片) 不是必需 <shard_map_server_name>.database.windows.net
弹性查询(远程) 不是必需 <remote_server_name>.database.windows.net
EdgeHub edgehub edgehub:// Azure SQL Edgeonly 中可用。 EdgeHub 始终是 Azure SQL Edge 实例的本地。 因此,无需指定路径或端口值。
Kafka kafka kafka://<kafka_bootstrap_server_name_ip>:<port_number> Azure SQL Edgeonly 中可用。
Azure 存储帐户 (v2) abs abs://<container_name>@<storage_account_name>.blob.core.windows.net/


abs://<storage_account_name>.blob.core.windows.net/ <container_name>
Azure Data Lake Storage Gen2 adls adls://<container_name>@<storage_account_name>.dfs.core.windows.net/


adls://<storage_account_name>.dfs.core.windows.net/<container_name>

位置路径:

  • <shard_map_server_name> = 承载分片映射管理器的Azure中的逻辑服务器名称。 DATABASE_NAME 参数提供用于托管分片映射的数据库,SHARD_MAP_NAME 用于分片映射本身。
  • <remote_server_name> = 弹性查询的目标逻辑服务器名称。 使用 DATABASE_NAME 参数指定数据库名称。

设置位置时的其他说明和指南:

  • 创建对象时,数据库引擎不会验证外部数据源是否存在。 要进行验证,请使用外部数据源创建外部表。

CREDENTIAL = credential_name

指定用于对外部数据源进行身份验证的数据库范围凭据。

创建凭证时的其他说明和指导:

  • 若要将数据从Azure 存储加载到Azure SQL 数据库,请使用共享访问签名(SAS 令牌)。
  • 只有在数据得到保护的情况下才需要 CREDENTIAL。 允许匿名访问的数据集不需要 CREDENTIAL
  • TYPE = BLOB_STORAGE 时,必须使用 SHARED ACCESS SIGNATURE 作为标识创建凭据。
  • 当连接到Azure 存储使用 WASB[s] 连接器时,必须使用存储帐户密钥(而不是共享访问签名(SAS)进行身份验证。
  • TYPE = HADOOP 时,必须使用存储帐户密钥作为 SECRET 创建凭据。
  • TYPE = BLOB_STORAGE 仅允许批量作;不能使用 TYPE = BLOB_STORAGE.. 为外部数据源创建外部表。

创建共享访问签名的方式有很多种:

  • 可以通过导航到 Azure 门户 -><Your_Storage_Account> -> 共享访问签名 -> 配置权限 -> 生成 SAS 和连接字符串来创建 SAS 令牌。 有关详细信息,请参阅生成共享访问签名

  • 可以使用 Azure 存储资源管理器 创建和配置 SAS

  • 可以通过 PowerShell、Azure CLI、.NET 和 REST API 以编程方式创建 SAS 令牌。 有关详细信息,请参阅 使用共享访问签名 (SAS) 限制对Azure 存储资源的访问权限。

  • 应按如下所示配置 SAS 令牌:

    • 生成 SAS 令牌时,它会在令牌开头包含问号('?')。 配置为密码时排除前导 ?
    • 使用有效的有效期(所有日期均采用 UTC 时间)。
  • 至少授予对应加载的文件的读取权限(例如 srt=o&sp=r)。 可以为不同的用例创建多个共享访问签名。 应按如下所示授予权限:

    操作 权限
    从文件中读取数据 读取
    从多个文件和子文件夹读取数据 读取和列出
    使用 Create External Table as Select (CETAS) 读取、创建和写入

有关将 CREDENTIALSHARED ACCESS SIGNATURETYPE = BLOB_STORAGE 配合使用的示例,请参阅 创建外部数据源以执行批量操作并将数据从 Azure 存储 检索到 SQL 数据库

若要创建数据库范围的凭据,请参阅 CREATE DATABASE SCOPED CREDENTIAL

TYPE = * [ BLOB_STORAGE |RDBMS |SHARD_MAP_MANAGER ] *

指定要配置的外部数据源的类型。 此参数并非始终是必需的,只应为某些外部数据源提供。

  • 使用 RDBMS 通过 SQL 数据库中的弹性查询进行跨数据库查询。
  • 连接到分片的 SQL 数据库时,请使用 SHARD_MAP_MANAGER 创建外部数据源。

重要

2027 年 3 月 31 日,分EXTERNAL DATA SOURCESHARD_MAP_MANAGER片映射管理器模式(水平分区)中的弹性查询(水平分区)即将结束支持。 在此日期之后,现有工作负荷将继续运行,但将不再获得支持,并且将不再能够创建新的类型 SHARD_MAP_MANAGER 外部数据源。 有关迁移选项,请参阅 弹性查询分片映射管理器模式的迁移指南

  • 用途 BLOB_STORAGE 仅用于 https 前缀。 对于 abdadls 前缀,请不要提供 TYPE

重要

如果使用任何其他外部数据源,请不要设置 TYPE

DATABASE_NAME = database_name

TYPE 设置为 RDBMSSHARD_MAP_MANAGER 时,配置此参数。

类型 DATABASE_NAME 的值
RDBMS 使用 LOCATION 提供的服务器上的远程数据库的名称
SHARD_MAP_MANAGER 作为分片映射管理器运行的数据库的名称

有关演示如何创建外部数据源 TYPE = RDBMS的示例,请参阅 “创建 RDBMS 外部数据源”。

SHARD_MAP_NAME = shard_map_name

TYPE 参数设置为 SHARD_MAP_MANAGER 时使用,仅用于设置分片映射的名称。

有关如何创建 TYPE = SHARD_MAP_MANAGER 的外部数据源的示例,请参阅创建分片映射管理器外部数据源

权限

需要对 Azure SQL 数据库 中的数据库具有 CONTROL 权限。

锁定

EXTERNAL DATA SOURCE 对象采用共享锁。

示例

答: 创建分片映射管理器外部数据源

重要

2027 年 3 月 31 日,分EXTERNAL DATA SOURCESHARD_MAP_MANAGER片映射管理器模式(水平分区)中的弹性查询(水平分区)即将结束支持。 在此日期之后,现有工作负荷将继续运行,但将不再获得支持,并且将不再能够创建新的类型 SHARD_MAP_MANAGER 外部数据源。 有关迁移选项,请参阅 弹性查询分片映射管理器模式的迁移指南

若要创建外部数据源以引用 SHARD_MAP_MANAGER,请指定在 SQL 数据库中托管分片映射管理器的 SQL 数据库服务器名称或虚拟机上的SQL Server数据库。

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

CREATE DATABASE SCOPED CREDENTIAL ElasticDBQueryCred
WITH IDENTITY = '<username>',
     SECRET = '<password>';

CREATE EXTERNAL DATA SOURCE MyElasticDBQueryDataSrc
WITH (
    TYPE = SHARD_MAP_MANAGER,
    LOCATION = '<server_name>.database.windows.net',
    DATABASE_NAME = 'ElasticScaleStarterKit_ShardMapManagerDb',
    CREDENTIAL = ElasticDBQueryCred,
    SHARD_MAP_NAME = 'CustomerIDShardMap'
);

有关分步教程,请参阅跨扩展云数据库进行报告(预览)

B. 创建 RDBMS 外部数据源

若要创建外部数据源以引用 RDBMS,请指定 SQL 数据库中的远程数据库的 SQL 数据库服务器名称。

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

CREATE DATABASE SCOPED CREDENTIAL SQL_Credential
WITH IDENTITY = '<username>',
     SECRET = '<password>';

CREATE EXTERNAL DATA SOURCE MyElasticDBQueryDataSrc
WITH (
    TYPE = RDBMS,
    LOCATION = '<server_name>.database.windows.net',
    DATABASE_NAME = 'Customers',
    CREDENTIAL = SQL_Credential
);

有关 RDBMS 的分步教程,请参阅跨数据库查询(纵向分区)入门(预览)

示例:批量操作

重要

在为批量作配置外部数据源时,不要在 URL 末尾/添加尾随LOCATION、文件名或共享访问签名参数。

C. 为从Azure 存储检索数据的批量操作创建外部数据源

使用以下数据源通过 BULK INSERTOPENROWSET BULK 执行批量作。 凭据必须设置 SHARED ACCESS SIGNATURE 作为标识、不应在 SAS 令牌中具有前导 ?、必须对应加载的文件(例如 srt=o&sp=r)至少具有读取权限,并且有效期应有效(所有日期均采用 UTC 时间)。 有关共享访问签名的详细信息,请参阅使用共享访问签名 (SAS)

使用托管标识为 Azure Blob 存储 (ABS) 创建外部数据源:

CREATE DATABASE SCOPED CREDENTIAL DSC_MI
WITH IDENTITY = 'Managed Identity';

--Create external data source pointing to the file path, and referencing database-scoped credential:
CREATE EXTERNAL DATA SOURCE PrivateABS
WITH (
    LOCATION = 'abs://<container>@<storage_account_name>.blob.core.windows.net/',
    CREDENTIAL = [DSC_MI]
);

使用用户标识为 Azure Data Lake Gen2(ADLS)创建外部数据源:

CREATE DATABASE SCOPED CREDENTIAL DSC_ADLS
WITH IDENTITY = 'User Identity';

--Create external data source pointing to the file path, and referencing database-scoped credential:
CREATE EXTERNAL DATA SOURCE PrivateADLS
WITH (
    LOCATION = 'adls://<container>@<storage_account_name>.dfs.core.windows.net/',
    CREDENTIAL = [DSC_ADLS]
);

若要查看这一使用中的示例,请参阅 BULK INSERT

示例:Azure SQL Edge

重要

有关为Azure SQL Edge配置外部数据的信息,请参阅 Azure SQL Edge 中的 Data 流式处理。

答: 创建外部数据源以引用 Kafka

applies to:Azure SQL Edgeonly

在本示例中,外部数据源是 IP 地址为 xxx.xxx.xxx.xxx 且在端口 1900 上进行侦听的 Kafka 服务器。 Kafka 外部数据源仅适用于数据流式处理,不支持谓词下推。

-- Create an External Data Source for Kafka
CREATE EXTERNAL DATA SOURCE MyKafkaServer
WITH (
    LOCATION = 'kafka://xxx.xxx.xxx.xxx:1900'
);

B. 创建外部数据源以引用 EdgeHub

applies to:Azure SQL Edgeonly

在此示例中,外部数据源是在与Azure SQL Edge相同的边缘设备上运行的 EdgeHub。 edgeHub 外部数据源仅适用于数据流式处理,不支持谓词下推。

-- Create an External Data Source for Kafka
CREATE EXTERNAL DATA SOURCE MyEdgeHub
WITH (
    LOCATION = 'edgehub://'
);

* Azure Synapse
Analytics *  

 

概述:Azure Synapse Analytics

应用到:Azure Synapse Analytics

为数据虚拟化创建外部数据源。 外部数据源用于建立连接并支持从外部数据源虚拟化数据和加载数据的主要用例。 有关详细信息,请参阅通过 Synapse SQL 使用外部表

Transact-SQL语法约定

语法

CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
( [ LOCATION = '<prefix>://<path>[:<port>]' ]
  [ [ , ] CREDENTIAL = <credential_name> ]
  [ [ , ] TYPE = HADOOP ]
)
[ ; ]

参数

data_source_name

指定数据源的用户定义名称。 名称在Azure Synapse Analytics中的Azure SQL 数据库中必须唯一。

LOCATION = '<prefix>://<path>'

提供连接协议和外部数据源的路径。

外部数据源 连接器位置前缀 位置路径
Data Lake Storage* Gen1 adl <storage_account>.azuredatalake.net
Data Lake Storage Gen2 abfs[s] <container>@<storage_account>.dfs.core.windows.net
Azure Blob 存储 wasbs <container>@<storage_account>.blob.core.windows.net
Azure Blob 存储 https <storage_account>.blob.core.windows.net/<container>/subfolders
Data Lake Storage Gen1 http[s] <storage_account>.azuredatalakestore.net/webhdfs/v1
Data Lake Storage Gen2 http[s] <storage_account>.dfs.core.windows.net/<container>/subfolders
Data Lake Storage Gen2 wasb[s] <container>@<storage_account>.blob.core.windows.net

* Microsoft Azure Data Lake Storage Gen1支持有限,建议对所有新开发使用 Gen2。

外部数据源 连接器位置前缀 专用 SQL 池:PolyBase 专用 SQL 池:本机* 无服务器 SQL 池
Data Lake Storage** Gen1 adl
Data Lake Storage Gen2 abfs[s]
Azure Blob 存储 wasbs 是***
Azure Blob 存储 https
Data Lake Storage Gen1 http[s]
Data Lake Storage Gen2 http[s]
Data Lake Storage Gen2 wasb[s]

* Azure Synapse Analytics中的无服务器和专用 SQL 池使用不同的代码库进行数据虚拟化。 无服务器 SQL 池支持本机数据虚拟化技术。 专用 SQL 池支持本机和 PolyBase 数据虚拟化。 使用 TYPE=HADOOP 创建 EXTERNAL DATA SOURCE 时,将使用 PolyBase 数据虚拟化。

** Microsoft Azure Data Lake Storage Gen1支持有限,建议对所有新开发使用 Gen2。

*** 建议使用更安全的 wasbs 连接器,而不是 wasb。 只有专用 SQL 池中的本机数据虚拟化(其中 TYPE 不等于 HADOOP)支持 wasb

位置路径:

  • <container> = 保存数据的存储帐户的容器。 根容器是只读的,数据无法写回容器。
  • <storage_account> = Azure 资源的存储帐户名称。

设置位置时的其他说明和指南:

  • 默认选项是在预配Azure Data Lake Storage Gen2时使用 enable secure SSL connections。 启用此功能后,必须在选择安全 TLS/SSL 连接时使用 abfss ,尽管 abfss 也适用于不安全的 TLS 连接。 有关详细信息,请参阅 Azure Blob 文件系统驱动程序 (ABFS)
  • Azure Synapse在创建对象时不验证外部数据源是否存在。 要进行验证,请使用外部数据源创建外部表。
  • 查询 Hadoop 时,所有表使用相同的外部数据源,以确保查询语义一致。
  • https: 前缀允许使用路径中的子文件夹。 https 不适用于所有数据访问方法。
  • 建议使用 wasbs,因为将使用安全的 TLS 连接发送数据。
  • 使用旧版 wasb:// 接口访问数据时,Azure V2 存储帐户不支持分层命名空间,但使用 wasbs:// 支持分层命名空间。

CREDENTIAL = credential_name

可选。 指定用于向外部数据源进行身份验证的数据库范围凭据。 没有凭据的外部数据源可以访问公共存储帐户,或使用调用方Microsoft Entra标识访问Azure存储上的文件。

创建凭证时的其他说明和指导:

  • 若要将数据从 Azure 存储 或 Azure Data Lake Store (ADLS) Gen2 加载到 Azure Synapse Analytics,请使用Azure 存储密钥。
  • 只有在数据得到保护的情况下才需要 CREDENTIAL。 允许匿名访问的数据集不需要 CREDENTIAL

若要创建数据库范围的凭据,请参阅 CREATE DATABASE SCOPED CREDENTIAL

  • 在无服务器 SQL 池中,数据库范围的凭据可以指定工作区托管标识、服务主体名称或共享访问签名(SAS)令牌。 也可在数据库范围的凭据中通过用户标识(也称为 Microsoft Entra 传递进行访问,对公开可用的存储进行匿名访问也是如此。 有关详细信息,请参阅支持的存储授权类型

  • 在专用 SQL 池中,数据库范围的凭据可以指定共享访问签名(SAS)令牌、存储访问密钥、服务主体、工作区托管标识或Microsoft Entra传递

TYPE = HADOOP

可选但不建议。

只能使用专用 SQL 池指定 TYPE。 HADOOP 是指定时唯一允许的值。 使用 TYPE=HADOOP 的外部数据源仅在专用 SQL 池中可用。

将 HADOOP 用于旧实现,否则建议使用较新的本机数据访问。 不要指定 TYPE 参数以使用较新的本机数据访问。

有关使用 TYPE = HADOOP 从Azure 存储加载数据的示例,请参阅 创建外部数据源以使用服务主体引用 Azure Data Lake Store Gen 1 或 2

Azure Synapse Analytics中的无服务器和专用 SQL 池使用不同的代码库进行数据虚拟化。 无服务器 SQL 池支持本机数据虚拟化技术。 专用 SQL 池支持本机和 PolyBase 数据虚拟化。 使用 TYPE=HADOOP 创建 EXTERNAL DATA SOURCE 时,将使用 PolyBase 数据虚拟化。

权限

需要对数据库拥有 CONTROL 权限。

锁定

EXTERNAL DATA SOURCE 对象采用共享锁。

安全性

大多数外部数据源支持使用数据库范围的凭据创建代理帐户,从而执行基于代理的身份验证。

支持对 Azure Data Lake Store Gen 2 存储帐户进行身份验证的共享访问签名(SAS)密钥。 想要使用共享访问签名进行身份验证的客户必须在 IDENTITY = "Shared Access Signature" 时创建数据库范围的凭据并输入 SAS 令牌作为机密。

如果在 IDENTITY = "Shared Access Signature" 时创建数据库范围的凭据并将存储密钥值用作机密,则会收到以下错误消息:

'HdfsBridge::isDirExist - Unexpected error encountered checking whether directory exists or not: AbfsRestOperationException: Operation failed: "Server failed to authenticate the request. Please refer to the information in the www-authenticate header.", 401, HEAD, [Storage path URL]'

示例

答: 使用 wasb:// 接口创建外部数据源以访问Azure 存储中的数据

在此示例中,外部数据源是名为 logs 的 Azure 存储 帐户 V2。 存储容器命名 daily为 。 Azure 存储外部数据源仅用于数据传输。 它不支持谓词下推。 通过 wasb:// 接口访问数据时,不支持分层命名空间。 通过 wasbwasbs 连接到Azure 存储时,必须使用存储帐户密钥而不是共享访问签名(SAS)进行身份验证。

此示例使用基于旧版 HADOOP Java的访问方法。 以下示例演示如何创建数据库范围的凭据以进行身份验证以Azure 存储。 在数据库凭据机密中指定Azure 存储帐户密钥。 可以在数据库范围内凭据标识中指定任何字符串,因为它在身份验证期间未用于Azure存储。

-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
     SECRET = '<azure_storage_account_key>';

-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
    TYPE = HADOOP,
    LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
    CREDENTIAL = AzureStorageCredential
);

B. 使用服务主体创建外部数据源以引用 Azure Data Lake Store Gen 1 或 2

Azure Data Lake存储连接可以基于 ADLS URI 和 Microsoft Entra 应用程序的服务主体。 有关创建此应用程序的文档可在 Data lake store 身份验证中使用 Microsoft Entra ID 找到。

-- If you do not have a Master Key on your DW you will need to create one.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

-- These values come from your Microsoft Entra application used to authenticate to ADLS
CREATE DATABASE SCOPED CREDENTIAL ADLS_credential
WITH
    -- IDENTITY = '<clientID>@<OAuth2.0TokenEndPoint>' ,
    IDENTITY = '536540b4-4239-45fe-b9a3-629f97591c0c@https://login.microsoftonline.com/42f988bf-85f1-41af-91ab-2d2cd011da47/oauth2/token',
    -- SECRET = '<KEY>'
    SECRET = 'BjdIlmtKp4Fpyh9hIvr8HJlUida/seM5kQ3EpLAmeDI=';

-- For Gen 1 - Create an external data source
-- TYPE: HADOOP - PolyBase uses Hadoop APIs to access data in Azure Data Lake Storage.
-- LOCATION: Provide Data Lake Storage Gen 1 account name and URI
-- CREDENTIAL: Provide the credential created in the previous step
CREATE EXTERNAL DATA SOURCE AzureDataLakeStore
WITH (
    TYPE = HADOOP,
    LOCATION = 'adl://newyorktaxidataset.azuredatalakestore.net',
    CREDENTIAL = ADLS_credential
);

-- For Gen2 - Create an external data source
-- TYPE: HADOOP - PolyBase uses Hadoop APIs to access data in Azure Data Lake Storage.
-- LOCATION: Provide Data Lake Storage Gen2 account name and URI
-- CREDENTIAL: Provide the credential created in the previous step
CREATE EXTERNAL DATA SOURCE AzureDataLakeStore
WITH (
    -- Note the abfss endpoint when your account has secure transfer enabled
    TYPE = HADOOP,
    LOCATION = 'abfss://data@newyorktaxidataset.dfs.core.windows.net',
    CREDENTIAL = ADLS_credential
);

C. 使用存储帐户密钥创建外部数据源以引用 Azure Data Lake Store Gen2

-- If you do not have a Master Key on your DW you will need to create one.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

CREATE DATABASE SCOPED CREDENTIAL ADLS_credential
WITH
    -- IDENTITY = '<storage_account_name>' ,
    IDENTITY = 'newyorktaxidata',
    -- SECRET = '<storage_account_key>'
    SECRET = 'yz5N4+bxSb89McdiysJAzo+9hgEHcJRJuXbF/uC3mhbezES/oe00vXnZEl14U0lN3vxrFKsphKov16C0w6aiTQ==';

-- Note this example uses a Gen2 secured endpoint (abfss)
CREATE EXTERNAL DATA SOURCE < data_source_name >
WITH (
    LOCATION = 'abfss://2013@newyorktaxidataset.dfs.core.windows.net',
    CREDENTIAL = ADLS_credential,
    TYPE = HADOOP
);

D. 使用 abfs:// 创建外部数据源以Azure Data Lake Store Gen2

使用 托管标识连接到 Azure Data Lake Store Gen2 帐户时,无需指定 >

-- If you do not have a Master Key on your DW you will need to create one
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

--Create database scoped credential with **IDENTITY = 'Managed Service Identity'**
CREATE DATABASE SCOPED CREDENTIAL msi_cred
WITH IDENTITY = 'Managed Service Identity';

--Create external data source with abfss:// scheme for connecting to your Azure Data Lake Store Gen2 account
CREATE EXTERNAL DATA SOURCE ext_datasource_with_abfss
WITH (
    TYPE = HADOOP,
    LOCATION = 'abfss://myfile@mystorageaccount.dfs.core.windows.net',
    CREDENTIAL = msi_cred
);

*分析学
平台系统 (PDW) *
 

 

概述:分析平台系统

适用于:分析平台系统(PDW)

为 PolyBase 查询创建外部数据源。 外部数据源用于建立连接并支持以下用例:在 SQL Server 中使用 PolyBase 进行数据虚拟化和数据加载。

Transact-SQL语法约定

语法

CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
  ( [ LOCATION = '<prefix>://<path>[:<port>]' ]
    [ [ , ] CREDENTIAL = <credential_name> ]
    [ [ , ] TYPE = HADOOP ]
    [ [ , ] RESOURCE_MANAGER_LOCATION = '<resource_manager>[:<port>]' )
[ ; ]

参数

data_source_name

指定数据源的用户定义名称。 该名称在 Analytics Platform System (PDW) 中的服务器上必须是唯一的。

LOCATION = '<prefix>://<path[:p ort]>'

提供连接协议和外部数据源的路径。

外部数据源 连接器位置前缀 位置路径
Cloudera CDH 或 Hortonworks HDP hdfs <Namenode>[:port]
Azure 存储 帐户 wasb[s] <container>@<storage_account>.blob.core.windows.net

位置路径:

  • <Namenode> = Hadoop 群集中 Namenode 的计算机名称、名称服务 URI 或 IP 地址。 PolyBase 必须解析 Hadoop 群集使用的任何 DNS 名称。
  • port = 外部数据源侦听的端口。 在 Hadoop 中,可以使用 fs.defaultFS 配置参数查找该端口。 默认值为 8020。
  • <container> = 保存数据的存储帐户的容器。 根容器是只读的,数据无法写回容器。
  • <storage_account> = Azure 资源的存储帐户名称。

设置位置时的其他说明和指南:

  • 创建对象时,PDW 引擎不会验证外部数据源是否存在。 要进行验证,请使用外部数据源创建外部表。
  • 查询 Hadoop 时,所有表使用相同的外部数据源,以确保查询语义一致。
  • 建议使用 wasbs,因为将使用安全的 TLS 连接发送数据。
  • 当通过 wasb:// 与Azure 存储帐户一起使用时,不支持分层命名空间。
  • 要确保在 Hadoop Namenode 故障转移期间成功进行 PolyBase 查询,请考虑针对 Hadoop 群集的 Namenode 使用虚拟 IP 地址。 否则,请执行 ALTER EXTERNAL DATA SOURCE 以指向新位置。

CREDENTIAL = credential_name

指定用于对外部数据源进行身份验证的数据库范围凭据。

创建凭证时的其他说明和指导:

  • 若要将数据从Azure 存储加载到Azure Synapse或 PDW,请使用Azure 存储密钥。
  • 只有在数据得到保护的情况下才需要 CREDENTIAL。 允许匿名访问的数据集不需要 CREDENTIAL

类型 = * [ HADOOP ] *

指定要配置的外部数据源的类型。 此参数并非总是必需的。

  • 当外部数据源为 Cloudera CDH、Hortonworks HDP 或Azure 存储时,请使用 HADOOP。

有关使用 TYPE = HADOOP 从 Azure 存储 加载数据的示例,请参阅 创建外部数据源以引用 Hadoop

RESOURCE_MANAGER_LOCATION = “ResourceManager_URI[:p ort]”

在 SQL Server 2019(15.x),除非连接到 Cloudera CDH、Hortonworks HDP(Azure 存储帐户),否则不要指定RESOURCE_MANAGER_LOCATION。

仅在连接到 Cloudera CDH、Hortonworks HDP 或Azure 存储帐户时配置此可选值。 有关受支持的 Hadoop 版本的完整列表,请参阅 PolyBase 连接配置

定义 RESOURCE_MANAGER_LOCATION 后,查询优化器做出基于成本的决策,以提高性能。 MapReduce 作业可用于将计算下推到 Hadoop。 指定 RESOURCE_MANAGER_LOCATION 可以显着减少 Hadoop 和 SQL 之间传输的数据量,从而提高查询性能。

如果未指定资源管理器,则会为 PolyBase 查询禁用将计算推送到 Hadoop。 创建外部数据源以引用启用了下推功能的 Hadoop 中提供了具体示例和详细指南。

创建外部数据源时,不会验证RESOURCE_MANAGER_LOCATION值。 输入不正确的值可能会导致每次尝试下推时查询失败,因为提供的值无法解析。

为了使 PolyBase 能够正常访问 Hadoop 外部数据源,以下 Hadoop 群集组件的端口必须处于打开状态:

  • HDFS 端口
    • Namenode
    • DataNode
  • 资源管理器
    • 作业提交
  • 作业历史记录

如果未指定端口,则使用“hadoop 连接”配置的当前设置选择默认值。

Hadoop 连接 默认资源管理器端口
1 50300
2 50300
3 8021
4 8032
5 8050
6 8032
7 8050

下表显示了这些组件的默认端口。 存在 Hadoop 版本依赖关系,以及不使用默认端口分配的自定义配置的可能性。

Hadoop 群集组件 “默认端口”
NameNode 8020
DataNode(数据传输、非特权 IPC 端口) 50010
DataNode(数据传输、特权 IPC 端口) 1019
资源管理器工作提交(Hortonworks 1.3) 50300
资源管理器作业提交(Cloudera 4.3) 8021
资源管理器作业提交(Linux 上的 Windows Cloudera 5.x 上的 Hortonworks 2.0) 8032
资源管理器作业提交 (Linux 上的 Hortonworks 2.x, 3.0, Hortonworks 2.1-3 on Windows) 8050
资源管理器作业历史记录 10020

权限

需要对 Analytics Platform System (PDW) 中数据库的 CONTROL 权限。

注意

在以前版本的 PDW 中,创建外部数据源需要 ALTER ANY EXTERNAL DATA SOURCE 权限。

锁定

EXTERNAL DATA SOURCE 对象采用共享锁。

安全性

PolyBase 支持大多数外部数据源的基于代理的身份验证。 创建数据库范围凭据以创建代理帐户。

不支持类型 HADOOP 为 SAS 令牌。 仅在使用存储帐户访问密钥时,才支持类型为 BLOB_STORAGE 的 SAS 令牌。 尝试创建类型为 HADOOP 的外部数据源和使用 SAS 凭据失败,并显示以下错误:

Msg 105019, Level 16, State 1 - EXTERNAL TABLE access failed due to internal error: 'Java exception raised on call to HdfsBridge_Connect. Java exception message: Parameters provided to connect to the Azure storage account aren't valid.: Error [Parameters provided to connect to the Azure storage account aren't valid.] occurred while accessing external file.'

示例

答: 创建外部数据源以引用 Hadoop

若要创建外部数据源来引用 Hortonworks HDP 或 Cloudera CDH,请指定 Hadoop Namenode 的计算机名称/IP 地址和端口。

CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://10.10.10.10:8050'
);

B. 创建外部数据源以引用 Hadoop 并启用下推

指定 RESOURCE_MANAGER_LOCATION 选项以便为 PolyBase 查询启用到 Hadoop 的下推计算。 启用后,PolyBase 会根据成本作出决策,以确定是否应将查询计算下推到 Hadoop。

CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://10.10.10.10:8020',
    RESOURCE_MANAGER_LOCATION = '10.10.10.10:8050'
);

C. 创建外部数据源以引用受 Kerberos 保护的 Hadoop

若要验证 Hadoop 群集是否受 Kerberos 保护,请检查 Hadoop core-site.xml 中的 hadoop.security.authentication 属性值。 若要引用受 Kerberos 保护的 Hadoop 群集,必须指定包含 Kerberos 用户名和密码的数据库范围凭据。 数据库主密钥用于加密数据库范围凭据密钥。

-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

-- Create a database scoped credential with Kerberos user name and password.
CREATE DATABASE SCOPED CREDENTIAL HadoopUser1
WITH IDENTITY = '<hadoop_user_name>',
     SECRET = '<hadoop_password>';

-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://10.10.10.10:8050',
    CREDENTIAL = HadoopUser1,
    RESOURCE_MANAGER_LOCATION = '10.10.10.10:8050'
);

D. 使用 wasb:// 接口创建外部数据源以访问Azure 存储中的数据

在此示例中,外部数据源是名为 logs 的 Azure V2 存储帐户。 存储容器命名 daily为 。 Azure 存储外部数据源仅用于数据传输。 它不支持谓词下推。 通过 wasb:// 接口访问数据时,不支持分层命名空间。 通过 wasbwasbs 连接到Azure 存储时,必须使用存储帐户密钥而不是共享访问签名(SAS)进行身份验证。

此示例演示如何创建数据库范围的凭据以进行身份验证以Azure存储。 在数据库凭据机密中指定Azure存储帐户密钥。 可以在数据库范围内凭据标识中指定任何字符串,因为它在身份验证期间未用于Azure存储。

-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
     SECRET = '<azure_storage_account_key>';

-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
    TYPE = HADOOP,
    LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
    CREDENTIAL = AzureStorageCredential
);

* SQL 托管实例 *  

概述:Azure SQL 托管实例

应用到:Azure SQL 托管实例

在Azure SQL 托管实例中创建外部数据源。 有关完整信息,请参阅 data virtualization with Azure SQL 托管实例

Azure SQL 托管实例中的数据虚拟化通过 OPENROWSETCREATE EXTERNAL TABLE 访问各种文件格式的外部数据。

Transact-SQL语法约定

语法

CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
  ( [ LOCATION = '<prefix>://<path>[:<port>]' ]
    [ [ , ] CREDENTIAL = <credential_name> ]
  )
[ ; ]

参数

data_source_name

指定数据源的用户定义名称。 该名称在数据库中必须唯一。

LOCATION = '<prefix>://<path[:p ort]>'

提供连接协议和外部数据源的路径。

外部数据源 位置前缀 位置路径
Azure Blob 存储 abs abs://<container>@<storage_account>.blob.core.windows.net/<path>/<file_name>
Azure Data Lake Service Gen2 adls adls://<container>@<storage_account>.dfs.core.windows.net/<path>/<file_name>

创建对象时,数据库引擎不会验证外部数据源是否存在。 要进行验证,请使用外部数据源创建外部表。

在为批量作配置外部数据源时,不要在 URL 末尾/添加尾随LOCATION、文件名或共享访问签名参数。

CREDENTIAL = credential_name

指定用于对外部数据源进行身份验证的数据库范围凭据。

创建凭证时的其他说明和指导:

  • 若要将数据从Azure 存储加载到Azure SQL 托管实例,请使用共享访问签名(SAS 令牌)。
  • 只有在数据得到保护的情况下才需要 CREDENTIAL。 允许匿名访问的数据集不需要 CREDENTIAL
  • 如果需要凭据,则必须使用 Managed IdentitySHARED ACCESS SIGNATURE 作为 IDENTITY 创建凭据。 若要创建数据库范围的凭据,请参阅 CREATE DATABASE SCOPED CREDENTIAL

对数据库范围的凭据使用托管服务标识:

  • 指定 WITH IDENTITY = 'Managed Identity'

  • 使用Azure SQL 托管实例的系统分配托管服务标识,如果用于此目的,则必须启用该标识。

    • Reader Azure RBAC 角色授予Azure SQL 托管实例的系统分配的托管服务标识,以Azure Blob 存储容器。 例如,通过 Azure 门户,请参阅使用 Azure 门户分配Azure角色

为数据库范围的凭据创建共享访问签名 (SAS):

  • 指定 WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = ...

  • 创建共享访问签名的方式有很多种:

    • 可以通过导航到 Azure 门户 -><Your_Storage_Account> -> 共享访问签名 -> 配置权限 -> 生成 SAS 和连接字符串来获取 SAS 令牌。 有关详细信息,请参阅生成共享访问签名
    • 可以使用 Azure 存储资源管理器 创建和配置 SAS
    • 可以通过 PowerShell、Azure CLI、.NET 和 REST API 以编程方式创建 SAS 令牌。 有关详细信息,请参阅 使用共享访问签名 (SAS) 限制对Azure 存储资源的访问权限。
  • 应按如下所示配置 SAS 令牌:

    • 生成 SAS 令牌时,它会在令牌开头包含问号('?')。 配置为密码时排除前导 ?
    • 使用有效的有效期(所有日期均采用 UTC 时间)。
  • 至少授予对应加载的文件的读取权限(例如 srt=o&sp=r)。 可以为不同的用例创建多个共享访问签名。 应按如下所示授予权限:

    操作 权限
    从文件中读取数据 读取
    从多个文件和子文件夹读取数据 读取和列出
    使用 Create External Table as Select (CETAS) 读取、创建和写入

权限

需要对 Azure SQL 托管实例 中的数据库具有 CONTROL 权限。

锁定

EXTERNAL DATA SOURCE 对象采用共享锁。

示例

有关更多示例,请参阅 data virtualization with Azure SQL 托管实例

答: 使用 OPENROWSET 或外部表从Azure SQL 托管实例查询外部数据

有关更多示例,请参阅 CREATE EXTERNAL DATA SOURCE 或使用 < Azure SQL 托管实例Data virtualization with Azure SQL 托管实例。

  1. 创建数据库主密钥(如果不存在)。

    -- Optional: Create MASTER KEY if it doesn't exist in the database:
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong Password>'
    GO
    
  2. 使用 SAS 令牌创建数据库范围的凭据。 还可使用托管标识。

    CREATE DATABASE SCOPED CREDENTIAL MyCredential
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
    SECRET = '<KEY>' ; --Removing leading '?'
    GO
    
  3. 使用凭据创建外部数据源。

    --Create external data source pointing to the file path, and referencing database-scoped credential:
    CREATE EXTERNAL DATA SOURCE MyPrivateExternalDataSource
    WITH (
        LOCATION = 'abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest',
        CREDENTIAL = [MyCredential]
    );
    
  4. 使用 OPENROWSET T-SQL 语法查询外部数据源中的 parquet 数据文件,依靠架构推理快速浏览数据,而无需了解该架构。

    --Query data with OPENROWSET, relying on schema inference.
    SELECT TOP 10 *
    FROM OPENROWSET (
        BULK 'bing_covid-19_data.parquet',
        DATA_SOURCE = 'MyExternalDataSource',
        FORMAT = 'parquet'
    ) AS filerows;
    
  5. 或者,使用 OPENROWSET WITH 子句查询数据,而不是依赖于架构推理,这可能会查询执行成本。 在 CSV 上,不支持架构推理。

    --Or, query data using the WITH clause on a CSV, where schema inference is not supported
    SELECT TOP 10 id,
                  updated,
                  confirmed,
                  confirmed_change
    FROM OPENROWSET (
        BULK 'bing_covid-19_data.csv',
        DATA_SOURCE = 'MyExternalDataSource',
        FORMAT = 'CSV', FIRSTROW = 2
    ) WITH (
        id INT,
        updated DATE,
        confirmed INT,
        confirmed_change INT
    ) AS filerows;
    
  6. 或者,创建 EXTERNAL FILE FORMAT 和 EXTERNAL TABLE,以本地表的形式查询数据。

    -- Or, create an EXTERNAL FILE FORMAT and an EXTERNAL TABLE
    --Create external file format
    CREATE EXTERNAL FILE FORMAT DemoFileFormat
    WITH (FORMAT_TYPE = PARQUET)
    GO
    
    --Create external table:
    CREATE EXTERNAL TABLE tbl_TaxiRides (
        vendorID VARCHAR(100) COLLATE Latin1_General_BIN2,
        tpepPickupDateTime DATETIME2,
        tpepDropoffDateTime DATETIME2,
        passengerCount INT,
        tripDistance FLOAT,
        puLocationId VARCHAR(8000),
        doLocationId VARCHAR(8000),
        startLon FLOAT,
        startLat FLOAT,
        endLon FLOAT,
        endLat FLOAT,
        rateCodeId SMALLINT,
        storeAndFwdFlag VARCHAR(8000),
        paymentType VARCHAR(8000),
        fareAmount FLOAT,
        extra FLOAT,
        mtaTax FLOAT,
        improvementSurcharge VARCHAR(8000),
        tipAmount FLOAT,
        tollsAmount FLOAT,
        totalAmount FLOAT
    )
    WITH (
        LOCATION = 'yellow/puYear=*/puMonth=*/*.parquet',
        DATA_SOURCE = NYCTaxiExternalDataSource,
        FILE_FORMAT = MyFileFormat\.\./\.\./\.\./azure-sql/
    );
    GO
    
    --Then, query the data via an external table with T-SQL:
    SELECT TOP 10 *
    FROM tbl_TaxiRides;
    GO
    

*Microsoft Fabric Data Warehouse *

概述:Microsoft Fabric Data Warehouse

应用到:Fabric Data Warehouse

创建外部数据源。

Transact-SQL语法约定

语法

CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
  ( LOCATION = '<prefix>://<path>[:<port>]' )
[ ; ]

参数

data_source_name

指定数据源的用户定义名称。 该名称在数据库中必须唯一。

LOCATION = '<prefix>://<path[:p ort]>'

提供连接协议和外部数据源的路径。

外部数据源 位置前缀 位置路径
Azure Blob 存储 https https://<storage_account>.blob.core.windows.net/<container>/<path>
Azure Data Lake Service Gen2 abfss abfss://<container>@<storage_account>.dfs.core.windows.net/<path>

创建对象时,数据库引擎不会验证外部数据源是否存在。

在为批量作配置外部数据源时,不要在 URL 末尾/添加尾随LOCATION、文件名或共享访问签名参数。

权限

如果目标存储帐户是专用的,则主体还必须具有读取引用的文件的权限。

  • 对于Azure Data Lake Storage和Azure Blob 存储,主体必须具有在容器或存储帐户级别分配的 Storage Blob 数据读取者角色(或更高版本)。
  • 对于 Fabric One Lake storage,主体必须具有“ReadAll”权限。

锁定

EXTERNAL DATA SOURCE 对象采用共享锁。

示例

答: 使用 OPENROWSET 或外部表查询外部数据

  1. 创建外部数据源。

    --Create external data source pointing to the file path, and referencing database-scoped credential:
    CREATE EXTERNAL DATA SOURCE MyPrivateExternalDataSource
    WITH (
        LOCATION = 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest'
    );
    
  2. 使用 OPENROWSET T-SQL 语法查询外部数据源中的 parquet 数据文件,依靠架构推理快速浏览数据,而无需了解该架构。

    --Query data with OPENROWSET, relying on schema inference.
    SELECT TOP 10 *
    FROM OPENROWSET (
        BULK 'bing_covid-19_data.parquet',
        DATA_SOURCE = 'MyPrivateExternalDataSource'
    );
    
  3. 或者,使用 OPENROWSET WITH 子句查询数据,而不是依赖于架构推理,这可能会查询执行成本。

    --Or, query data using the WITH clause on a CSV, where schema inference is not supported
    SELECT TOP 10 id,
        updated,
        confirmed,
        confirmed_change
    FROM OPENROWSET (
        BULK 'bing_covid-19_data.csv', DATA_SOURCE = 'MyPrivateExternalDataSource'
        FIRSTROW = 2
    ) WITH (
        id INT,
        updated DATE,
        confirmed INT,
        confirmed_change INT
    ) AS filerows;
    

* Fabric SQL 数据库 *  

 

概述:Microsoft Fabric中的 SQL 数据库

Microsoft Fabric

在 Fabric 中为 SQL 数据库中的 Data 虚拟化创建外部数据源。

Transact-SQL语法约定

语法

CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
  ( [ LOCATION = '<prefix>://<path>[:<port>]' ]
[ ; ]

参数

data_source_name

指定数据源的用户定义名称。 该名称在数据库中必须唯一。

LOCATION = '<prefix>://<path[:p ort]>'

提供连接协议和外部数据源的路径。

Fabric SQL 数据库仅支持 OneLake(abfss)作为数据源。

外部数据源 连接器位置前缀 位置路径 可用性
OneLake abfss abfss://<workspaceid>@<tenant>.dfs.fabric.microsoft.com/ Fabric SQL 数据库

设置位置时的其他说明和指南:

  • 创建对象时,数据库引擎不会验证外部数据源是否存在。 要进行验证,请使用外部数据源创建外部表。

权限

需要对 Azure SQL 数据库 中的数据库具有 CONTROL 权限。

锁定

EXTERNAL DATA SOURCE 对象采用共享锁。

示例

答: 创建一个外部数据源到 Lakehouse 文件夹

这个例子涉及连接一个名为 MyLakeHouse Lakehouse的外部数据源,以便访问已上传的Parquet和CSV文件。 本示例中的这些文件位于文件夹下方FilesContoso目录中。

若要创建 Fabric Lakehouse 数据源,需要提供工作区 ID、租户和 Lakehouse ID。 若要查找 lakehouse 的 ABFSS 文件位置,请转到Fabric门户。 进入你的Lakehouse,找到想要的文件夹位置,选择...“属性”。 复制 ABFS路径,大致如下: abfss://<WorkSpaceID>@<Tenant>.dfs.fabric.microsoft.com/<LakehouseID>/Files/Contoso

由于 Fabric SQL 数据库仅支持Microsoft Entra ID直通身份验证,因此无需提供数据库范围的凭据,因此连接将始终使用用户的登录凭据访问位置。

CREATE EXTERNAL DATA SOURCE MyLakeHouse 
WITH (
 LOCATION = 'abfss://<workspace id>@<tenant>.dfs.fabric.microsoft.com/<lakehouseid>/Files/Contoso'
);