创建用于查询外部数据的外部数据源,用于 PolyBase 和数据虚拟化功能。
本文提供所选任何 SQL 产品的语法、参数、注解、权限和示例。
选择一个产品
在下面的行中,选择你感兴趣的产品名称,系统将只显示该产品的信息。
* SQL Server *
概述:SQL Server 2016
应用到:SQL Server 2016 (13.x)
为 PolyBase 查询创建外部数据源。 外部数据源用于建立连接以及支持以下这些用例:
- 在 SQL ServerPolyBase 进行数据虚拟化和数据加载>
- 使用
BULK INSERT或OPENROWSET大容量加载操作
注意
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 存储。 通过 wasb 或 wasbs 连接到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 INSERT或OPENROWSET大容量加载操作
注意
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 Server 2019 (15.x)的功能,请访问 CREATE EXTERNAL DATA SOURCE。
若要查看 SQL Server 2022 (16.x)的功能,请访问 CREATE EXTERNAL DATA SOURCE。
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.. 为外部数据源创建外部表。 - 通过
wasb或wasbs连接到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 时间)。
- 生成 SAS 令牌时,它会在令牌开头包含问号('?')。 配置为密码时排除前导
至少授予对应加载的文件的读取权限(例如
srt=o&sp=r)。 可以为不同的用例创建多个共享访问签名。 应按如下所示授予权限:操作 权限 从文件中读取数据 读取 从多个文件和子文件夹读取数据 读取和列出
有关将 CREDENTIAL 与 SHARED ACCESS SIGNATURE 和 TYPE = 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 INSERT 或OPENROWSET 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:// 接口访问数据时,不支持分层命名空间。 通过 wasb 或 wasbs 连接到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 INSERT 或 OPENROWSET 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 INSERT或OPENROWSET大容量加载操作
注意
若要查看 SQL Server 2022 (16.x)的功能,请访问 CREATE EXTERNAL DATA SOURCE。
注意
若要查看 SQL Server 2022 (16.x)的功能,请访问 CREATE EXTERNAL DATA SOURCE。
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。 - 使用
wasbs或abfss是可选的,但建议在 2019 SQL Server (15.x) 中访问Azure 存储帐户,因为将使用安全的 TLS/SSL 连接发送数据。 - 从 SQL Server 2019 (15.x) CU1 开始访问Azure 存储帐户时,支持
abfs或abfssAPI。 有关详细信息,请参阅 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 以指向新位置。 - 支持在大数据群集的主实例和存储池之间连接
sqlhdfs和sqldatapool类型。 对于 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 时间)。
- 生成 SAS 令牌时,它会在令牌开头包含问号('?')。 配置为密码时排除前导
至少授予对应加载的文件的读取权限(例如
srt=o&sp=r)。 可以为不同的用例创建多个共享访问签名。 应按如下所示授予权限:操作 权限 从文件中读取数据 读取 从多个文件和子文件夹读取数据 读取和列出
有关将 CREDENTIAL 与 SHARED ACCESS SIGNATURE 和 TYPE = 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 INSERT 或OPENROWSET 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 参数已扩展,现在使用 TNSNamesFile 和 ServerName 作为变量来浏览 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:// 接口访问数据时,不支持分层命名空间。 通过 wasb 或 wasbs 连接到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 INSERT 或 OPENROWSET 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 INSERT或OPENROWSET大容量加载操作
注意
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 存储帐户 v2:
- LOCATION 路径可以使用格式:
- 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
指定用于对外部数据源进行身份验证的数据库范围凭据。
创建凭证时的其他说明和指导:
- 只有在数据得到保护的情况下才需要
CREDENTIAL。 允许匿名访问的数据集不需要CREDENTIAL。 - 访问Azure 存储帐户(V2)或Azure Data Lake Storage Gen2时,
IDENTITY必须SHARED ACCESS SIGNATURE。 - 有关示例,请参阅 创建外部数据源以执行批量操作并将数据从Azure 存储检索到 SQL 数据库。
创建共享访问签名的方式有很多种:
可以通过导航到 Azure 门户 -><Your_Storage_Account> -> 共享访问签名 -> 配置权限 -> 生成 SAS 和连接字符串来创建 SAS 令牌。 有关详细信息,请参阅生成共享访问签名。
可以使用 Azure 存储资源管理器 创建和配置 SAS
。 可以通过 PowerShell、Azure CLI、.NET 和 REST API 以编程方式创建 SAS 令牌。 有关详细信息,请参阅 使用共享访问签名 (SAS) 限制对Azure 存储资源的访问权限。
应按如下所示配置 SAS 令牌:
- 生成 SAS 令牌时,它会在令牌开头包含问号('?')。 配置为密码时排除前导
?。 - 使用有效的有效期(所有日期均采用 UTC 时间)。
- 生成 SAS 令牌时,它会在令牌开头包含问号('?')。 配置为密码时排除前导
至少授予对应加载的文件的读取权限(例如
srt=o&sp=r)。 可以为不同的用例创建多个共享访问签名。 应按如下所示授予权限:操作 权限 从文件中读取数据 读取 从多个文件和子文件夹读取数据 读取和列出 使用 Create External Table as Select (CETAS) 读取、创建、列出和写入 对于第 2 代Azure Blob 存储和Azure Data Lake:
- 允许的服务:必须选择
Blob才能生成 SAS 令牌
- 允许的服务:必须选择
允许的资源类型:必须选择
Container和Object才能生成 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 参数已扩展,现在使用 TNSNamesFile 和 ServerName 作为变量来浏览 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)。 生成共享访问签名令牌的一种简单方法,请执行以下步骤。 有关详细信息,请参阅凭据。
导航到Azure门户和所需的存储帐户。
导航到“数据存储”菜单下的所需容器。
选择“共享访问令牌”。
根据所需作选择适当的权限:
操作 权限 从文件中读取数据 读取 从多个文件和子文件夹读取数据 读取和列出 使用 Create External Table as Select (CETAS) 读取、创建和写入 选择令牌的过期日期。
生成 SAS 令牌和 URL。
复制 SAS 令牌。
F. 使用 abs:// 接口创建外部数据源以访问Azure Blob 存储中的数据
Applies to: SQL Server 2022 (16.x) 及更高版本
从 SQL Server 2022(16.x)开始,对 Azure 存储 Account v2 使用新的前缀 abs。
abs 前缀支持使用 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 INSERT 或 OPENROWSET 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 INSERT或OPENROWSET大容量加载操作
支持通过Azure Arc启用的实例的托管标识连接。有关详细信息,请查看 Connect,以便从 PolyBase 使用托管标识Azure 存储。
注意
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 存储帐户 v2:
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内使用的别名,该别名将用于替换主机名和端口。
从 SQL Server 2025 (17.x)开始,使用 sqlserver 作为数据源时,Microsoft ODBC 驱动程序版本 18 for SQL Server 是默认驱动程序。 该Encryption选项是必需的(Yes、或NoStrict),并且TrustServerCertificate可用(Yes或No)。 如果未 Encryption 指定,则默认行为为 Encrypt=Yes;TrustServerCertificate=No;,并且需要服务器证书。
若要使用 TDS 8.0 协议进行连接,已添加严格模式(Encrypt=Strict)。 在此模式下,需要安装受信任的服务器证书,并且始终经过验证(忽略 TrustServerCertificate)。 如果新关键字 HostnameInCertificate 与指定的服务器不同,则可用于指定在证书中找到的预期主机名。
HostnameInCertificate 在所有加密模式下都可用,并且如果启用了服务器端 强制加密 选项,这将导致驱动程序在 可选 模式或 强制 模式下验证证书,除非使用 TrustServerCertificate禁用。
有关
应始终使用最新的驱动程序。 但是,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
指定用于对外部数据源进行身份验证的数据库范围凭据。
创建凭证时的其他说明和指导:
只有在数据得到保护的情况下才需要
CREDENTIAL。 允许匿名访问的数据集不需要CREDENTIAL。访问Azure 存储帐户(V2)或Azure Data Lake Storage Gen2时,
IDENTITY必须SHARED ACCESS SIGNATURE。有关示例,请参阅 创建外部数据源以执行批量操作并将数据从Azure 存储检索到 SQL 数据库。
创建共享访问签名的方式有很多种:
可以通过导航到
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 令牌
- 允许的服务:必须选择
允许的资源类型:必须选择
Container和Object才能生成 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 上的
答: 在 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 参数已扩展,现在使用 TNSNamesFile 和 ServerName 作为变量来浏览 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)。 生成共享访问签名令牌的一种简单方法,请执行以下步骤。 有关详细信息,请参阅凭据。
- 导航到Azure门户和所需的存储帐户。
- 导航到“数据存储”菜单下的所需容器。
- 选择“共享访问令牌”。
- 根据所需作选择适当的权限。 有关参考,请使用下表:
| 操作 | 权限 |
|---|---|
| 从文件中读取数据 | 读取 |
| 从多个文件和子文件夹读取数据 | 读取和列出 |
| 使用 Create External Table as Select (CETAS) | 读取、创建和写入 |
- 选择令牌的过期日期。
- 生成 SAS 令牌和 URL。
- 复制 SAS 令牌。
F. 使用 abs:// 接口创建外部数据源以访问Azure Blob 存储中的数据
Applies to: SQL Server 2022 (16.x) 及更高版本。
对 Azure 存储 Account v2 使用新的前缀 abs。
abs 前缀支持使用 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 INSERT 或 OPENROWSET 的批量操作使用以下数据源。 凭据必须设置 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 选项创建外部数据源
在前面的示例中,有两个代码示例。 第一个代码片段具有 Encryption 并 TrustServerCertificate 设置。
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 数据库
为弹性查询创建外部数据源。 外部数据源用于建立连接以及支持以下这些用例:
- 数据虚拟化(预览版)
- 使用
BULK INSERT或OPENROWSET大容量加载操作 - 将 SQL 数据库与 弹性查询配合使用查询远程 SQL 数据库或Azure Synapse实例
- 使用弹性查询查询分片的 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 时间)。
- 生成 SAS 令牌时,它会在令牌开头包含问号('?')。 配置为密码时排除前导
至少授予对应加载的文件的读取权限(例如
srt=o&sp=r)。 可以为不同的用例创建多个共享访问签名。 应按如下所示授予权限:操作 权限 从文件中读取数据 读取 从多个文件和子文件夹读取数据 读取和列出 使用 Create External Table as Select (CETAS) 读取、创建和写入
有关将 CREDENTIAL 与 SHARED ACCESS SIGNATURE 和 TYPE = 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前缀。 对于abd和adls前缀,请不要提供TYPE。
重要
如果使用任何其他外部数据源,请不要设置 TYPE 。
DATABASE_NAME = database_name
当 TYPE 设置为 RDBMS 或 SHARD_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 INSERT 或 OPENROWSET 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 中的
答: 创建外部数据源以引用 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 使用外部表。
重要
若要使用具有 弹性查询Azure SQL 数据库创建外部数据源来查询Azure Synapse Analytics资源,请参阅 CREATE EXTERNAL DATA SOURCE for Azure 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:// 接口访问数据时,不支持分层命名空间。 通过 wasb 或 wasbs 连接到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
使用
-- 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 中使用
语法
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:// 接口访问数据时,不支持分层命名空间。 通过 wasb 或 wasbs 连接到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 托管实例中的数据虚拟化通过 OPENROWSET 或 CREATE EXTERNAL TABLE 访问各种文件格式的外部数据。
语法
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 Identity或SHARED 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 时间)。
- 生成 SAS 令牌时,它会在令牌开头包含问号('?')。 配置为密码时排除前导
至少授予对应加载的文件的读取权限(例如
srt=o&sp=r)。 可以为不同的用例创建多个共享访问签名。 应按如下所示授予权限:操作 权限 从文件中读取数据 读取 从多个文件和子文件夹读取数据 读取和列出 使用 Create External Table as Select (CETAS) 读取、创建和写入
权限
需要对 Azure SQL 托管实例 中的数据库具有 CONTROL 权限。
锁定
对 EXTERNAL DATA SOURCE 对象采用共享锁。
示例
有关更多示例,请参阅 data virtualization with Azure SQL 托管实例。
答: 使用 OPENROWSET 或外部表从Azure SQL 托管实例查询外部数据
有关更多示例,请参阅
创建数据库主密钥(如果不存在)。
-- Optional: Create MASTER KEY if it doesn't exist in the database: CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong Password>' GO使用 SAS 令牌创建数据库范围的凭据。 还可使用托管标识。
CREATE DATABASE SCOPED CREDENTIAL MyCredential WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<KEY>' ; --Removing leading '?' GO使用凭据创建外部数据源。
--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] );使用 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;或者,使用 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;或者,创建 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
创建外部数据源。
语法
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 或外部表查询外部数据
创建外部数据源。
--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' );使用 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' );或者,使用 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 数据库
在 Fabric 中为 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文件。 本示例中的这些文件位于文件夹下方Files的Contoso目录中。
若要创建 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'
);