适用于:MicrosoftFabric 的 Microsoft Fabric
Warehouse 中的 SQL Server 2016 (13.x) 及更高版本
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL 分析终结点
创建用于查询外部数据的外部数据源,用于 PolyBase 和数据虚拟化功能。
本文提供所选任何 SQL 产品的语法、参数、注解、权限和示例。
选择一个产品
在下面的行中,选择你感兴趣的产品名称,系统将只显示该产品的信息。
* SQL Server *
概述:SQL Server 2016
适用于:SQL Server 2016 (13.x)
为 PolyBase 查询创建外部数据源。 外部数据源用于建立连接以及支持以下这些用例:
- 在 SQL Server 中使用数据虚拟化和 PolyBase 进行数据虚拟化和数据加载
- 使用
BULK INSERT或OPENROWSET大容量加载操作
注意
此语法在不同版本的 SQL Server 之间有所不同。 使用版本选择器下拉列表选择适当的版本。
若要查看 SQL Server 2019 (15.x) 的功能,请访问 CREATE EXTERNAL DATA SOURCE。
若要查看 SQL Server 2022 (16.x) 的功能,请访问 CREATE EXTERNAL DATA SOURCE。
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) 到 SQL Server 2019 (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 Browser 服务,则使用此路径。
设置位置时的其他说明和指南:
- 创建对象时,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。
TYPE = * [ 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 |
| 资源管理器作业提交(Windows 上的 Hortonworks 2.0,Linux 上的 Cloudera 5.x) | 8032 |
| 资源管理器作业提交(Linux 上的 Hortonworks 2.x、3.0,Windows 上的 Hortonworks 2.1-3) | 8050 |
| 资源管理器作业历史记录 | 10020 |
权限
需要对 SQL Server 中数据库的 CONTROL 权限。
锁定
对 EXTERNAL DATA SOURCE 对象采用共享锁。
安全性
PolyBase 支持大多数外部数据源的基于代理的身份验证。 创建数据库范围凭据以创建代理帐户。
示例
重要
有关如何安装和启用 PolyBase 的信息,请参阅在 Windows 上安装 PolyBase
答: 创建外部数据源以引用 Hadoop
若要创建外部数据源来引用 Hortonworks HDP 或 Cloudera CDH Hadoop 群集,请指定 Hadoop Namenode 的计算机名称/IP 地址和端口。
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8050',
TYPE = HADOOP
);
B. 创建外部数据源以引用 Hadoop 并启用下推
指定 RESOURCE_MANAGER_LOCATION 选项以便为 PolyBase 查询启用到 Hadoop 的下推计算。 启用后,PolyBase 会根据成本作出决策,以确定是否应将查询计算下推到 Hadoop。
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8020',
TYPE = HADOOP,
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 (
LOCATION = 'hdfs://10.10.10.10:8050',
CREDENTIAL = HadoopUser1,
TYPE = HADOOP,
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 (
LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
相关内容
概述:SQL Server 2017
适用于:SQL Server 2017 (14.x)
为 PolyBase 查询创建外部数据源。 外部数据源用于建立连接以及支持以下这些用例:
- 在 SQL Server 中使用 PolyBase 进行数据虚拟化和数据加载
- 使用
BULK INSERT或OPENROWSET大容量加载操作
注意
此语法在不同版本的 Linux 上的 SQL Server 之间有所不同。 使用版本选择器下拉列表选择适当的版本。
若要查看 SQL Server 2019 (15.x) 的功能,请访问 CREATE EXTERNAL DATA SOURCE。
若要查看 SQL Server 2022 (16.x) 的功能,请访问 CREATE EXTERNAL DATA SOURCE。
注意
此语法在不同版本的 SQL Server 之间有所不同。 使用版本选择器下拉列表选择适当的版本。
若要查看 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 Browser 服务,则使用此路径。
设置位置时的其他说明和指南:
- 创建对象时,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连接到wasbsAzure 存储时,必须使用存储帐户密钥(而不是共享访问签名(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 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。 - 使用
BLOB_STORAGE或 OPENROWSET BULK 从 Azure 存储帐户执行批量作时使用。 在 SQL Server 2017 (14.x) 中引入。 在HADOOP打算针对 Azure 存储时使用CREATE EXTERNAL TABLE。
注意
即使在访问 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 |
| 资源管理器作业提交(Windows 上的 Hortonworks 2.0,Linux 上的 Cloudera 5.x) | 8032 |
| 资源管理器作业提交(Linux 上的 Hortonworks 2.x、3.0,Windows 上的 Hortonworks 2.1-3) | 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 的信息,请参阅在 Windows 上安装 PolyBase
答: 创建外部数据源以引用 Hadoop
若要创建外部数据源来引用 Hortonworks HDP 或 Cloudera CDH Hadoop 群集,请指定 Hadoop Namenode 的计算机名称/IP 地址和端口。
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8050',
TYPE = HADOOP
);
B. 创建外部数据源以引用 Hadoop 并启用下推
指定 RESOURCE_MANAGER_LOCATION 选项以便为 PolyBase 查询启用到 Hadoop 的下推计算。 启用后,PolyBase 会根据成本作出决策,以确定是否应将查询计算下推到 Hadoop。
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8020',
TYPE = HADOOP,
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 (
LOCATION = 'hdfs://10.10.10.10:8050',
CREDENTIAL = HadoopUser1,
TYPE = HADOOP,
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 (
LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
示例:批量操作
重要
在为批量作配置外部数据源时,不要在 URL 末尾/添加尾随LOCATION、文件名或共享访问签名参数。
E. 创建外部数据源以用于从 Azure 存储检索数据的批量操作
适用于: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',
-- Remove ? from the beginning of the SAS token
SECRET = '<azure_storage_account_key>';
CREATE EXTERNAL DATA SOURCE MyAzureInvoices
WITH (
LOCATION = 'https://newinvoices.blob.core.windows.net/week3',
CREDENTIAL = AccessAzureInvoices,
TYPE = BLOB_STORAGE
);
若要查看这一使用中的示例,请参阅 BULK INSERT。
相关内容
概述:SQL Server 2019
适用于:SQL Server 2019 (15.x)
为 PolyBase 查询创建外部数据源。 外部数据源用于建立连接以及支持以下这些用例:
- 在 SQL Server 中使用 PolyBase 进行数据虚拟化和数据加载
- 使用
BULK INSERT或OPENROWSET大容量加载操作
注意
此语法在不同版本的 SQL Server 之间有所不同。 使用版本选择器下拉列表选择适当的版本。
若要查看 SQL Server 2022 (16.x) 的功能,请访问 CREATE EXTERNAL DATA SOURCE。
注意
此语法在不同版本的 SQL Server 之间有所不同。 使用版本选择器下拉列表选择适当的版本。
若要查看 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) 到 SQL Server 2019 (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 |
仅在 SQL Server 2019 大数据群集中受支持 | 仅基本身份验证 |
| SQL Server 大数据群集存储池 | sqlhdfs |
sqlhdfs://controller-svc/default |
仅在 SQL Server 2019 大数据群集中受支持 | 仅基本身份验证 |
位置路径:
-
<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 Browser 服务,则使用此路径。
设置位置时的其他说明和指南:
- 创建对象时,SQL Server 数据库引擎不会验证外部数据源是否存在。 要进行验证,请使用外部数据源创建外部表。
- 查询 Hadoop 时,所有表使用相同的外部数据源,以确保查询语义一致。
- 可使用
sqlserver连接器将 SQL Server 2019 (15.x) 连接到另一个 SQL Server 或 Azure SQL 数据库。 - 通过
Driver={<Name of Driver>}连接时,请指定ODBC。 - 可选择性地使用
wasbs或abfss,但建议在 SQL Server 2019 (15.x) 中访问 Azure 存储帐户时使用,原因是将使用安全的 TLS/SSL 连接发送数据。 - 从 SQL Server 2019 (15.x) CU11 开始,访问 Azure 存储帐户时,支持使用
abfs或abfssAPI。 有关详细信息,请参阅 Azure Blob 文件系统驱动程序 (ABFS)。 - 从 SQL Server 2019 (15.x) CU11+ 开始,支持在 Azure Data Lake Storage Gen2 中通过
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 大数据集群中查询 HDFS。 - SQL Server 对 HDFS Cloudera (CDP) 和 Hortonworks (HDP) 外部数据源的支持已停用,并且不包括在 SQL Server 2022 (16.x) 及更高版本中。 有关详细信息,请参阅 Microsoft SQL Server 平台上的大数据选项。
CONNECTION_OPTIONS = key_value_pair
为 SQL Server 2019(15.x)及更高版本指定。 通过 ODBC 连接到外部数据源时指定其他选项。 若要使用多个连接选项,请用分号分隔它们。
适用于通用 ODBC 连接,还适用于 SQL Server、Oracle、Teradata、MongoDB 和 Azure Cosmos DB API for MongoDB 的内置 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 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。 - 在通过
BLOB_STORAGE或 SQL Server 2017(14.x)的 OPENROWSET BULK 从 Azure 存储帐户执行批量作时使用。 当打算针对 Azure 存储创建外部表时使用HADOOP。 - SQL Server 对 HDFS Cloudera (CDP) 和 Hortonworks (HDP) 外部数据源的支持已停用,并且不包括在 SQL Server 2022 (16.x) 及更高版本中。 有关详细信息,请参阅 Microsoft SQL Server 平台上的大数据选项。
有关使用 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 |
| 资源管理器作业提交(Windows 上的 Hortonworks 2.0,Linux 上的 Cloudera 5.x) | 8032 |
| 资源管理器作业提交(Linux 上的 Hortonworks 2.x、3.0,Windows 上的 Hortonworks 2.1-3) | 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 的信息,请参阅在 Windows 上安装 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',
CREDENTIAL = OracleProxyAccount,
PUSHDOWN = ON
);
(可选)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 将搜索由 tnsnames.ora 指定的 TNSNamesFile 文件位置,并搜索由 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 (
LOCATION = 'hdfs://10.10.10.10:8050',
TYPE = HADOOP
);
C. 创建外部数据源以引用 Hadoop 并启用下推
指定 RESOURCE_MANAGER_LOCATION 选项以便为 PolyBase 查询启用到 Hadoop 的下推计算。 启用后,PolyBase 会根据成本作出决策,以确定是否应将查询计算下推到 Hadoop。
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8020',
TYPE = HADOOP,
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 (
LOCATION = 'hdfs://10.10.10.10:8050',
CREDENTIAL = HadoopUser1,
TYPE = HADOOP,
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 (
LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
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',
-- Remove ? from the beginning of the SAS token
SECRET = '<azure_shared_access_signature>';
CREATE EXTERNAL DATA SOURCE MyAzureInvoices
WITH (
LOCATION = 'https://newinvoices.blob.core.windows.net/week3',
CREDENTIAL = AccessAzureInvoices,
TYPE = BLOB_STORAGE
);
若要查看这一使用中的示例,请参阅 BULK INSERT。
一。 创建外部数据源来使用 abfs:// 接口访问 Azure 存储中的数据
适用于:SQL Server 2019 (15.x) CU11 及更高版本
在此示例中,外部数据源是使用 logs 的 Azure Data Lake Storage Gen2 帐户 。 存储容器被称为 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 (
LOCATION = 'abfss://daily@logs.dfs.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
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 Server 中使用 PolyBase 进行数据虚拟化和数据加载
- 使用
BULK INSERT或OPENROWSET大容量加载操作
注意
此语法在不同版本的 SQL Server 之间有所不同。 使用版本选择器下拉列表选择适当的版本。 此内容适用于 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 Browser 服务,则使用此路径。 -
<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) 外部数据源的支持将停用,不会包含在 SQL Server 2022 (16.x) 中。 无需在 SQL Server 2022(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 for MongoDB 的内置 ODBC 连接器。
key_value_pair 是特定连接选项的关键字和值。 哪些关键字和值可用由外部数据源类型决定。 驱动程序的名称是必需的(最基本的要求),但设置其他选项(例如 APP='<your_application_name>' 或 ApplicationIntent= ReadOnly|ReadWrite)也很有用,可以帮助进行故障排除。
可能的键值对特定于驱动程序。 有关每个提供程序的详细信息,请参阅 CREATE EXTERNAL DATA SOURCE (Transact-SQL) CONNECTION_OPTIONS。
从 SQL Server 2022(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) 读取、创建、列出和写入 对于 Azure Blob 存储和 Azure Data Lake Gen 2:
- 允许的服务:必须选择
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 的信息,请参阅在 Windows 上安装 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',
CREDENTIAL = OracleProxyAccount,
PUSHDOWN = ON
);
(可选)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 将搜索由 tnsnames.ora 指定的 TNSNamesFile 文件位置,并搜索由 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 文件
适用于: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 存储中的数据
适用于:SQL Server 2022 (16.x) 及更高版本
从 SQL Server 2022 (16.x) 开始,为 Azure 存储帐户 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 存储检索数据的批量操作
适用于: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 Server 中使用数据虚拟化和 PolyBase 进行数据虚拟化和数据加载
- 使用
BULK INSERT或OPENROWSET大容量加载操作
支持 Azure Arc 启用的实例的托管标识连接。有关详细信息,请查看 PolyBase 对托管标识到 Azure 存储的支持。
注意
此语法在不同版本的 SQL Server 之间有所不同。 使用版本选择器下拉列表选择适当的版本。 此内容适用于 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) 或 对 Azure 存储 1 的托管标识的 PolyBase 支持 |
| 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) 或 对 Azure 存储 1 的托管标识的 PolyBase 支持 |
| 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 需要 Azure Arc 启用的 SQL Server 2025 (17.x) 预览实例。有关详细信息,请查看 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 Browser 服务,则使用此路径。 |
<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)及更高版本中的 Azure Data Lake Storage Gen2 支持使用前缀
adls的 Azure 存储帐户的分层命名空间选项。SQL Server 对 HDFS Cloudera (CDP) 和 Hortonworks (HDP) 外部数据源的支持已停用,并且不包括在 SQL Server 2022 (16.x) 及更高版本中。 无需在 SQL Server 2025 (17.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用于 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 的两种 URL 格式。adls路径
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 for MongoDB 的内置 ODBC 连接器。
key_value_pair 是特定连接选项的关键字和值。 哪些关键字和值可用由外部数据源类型决定。 驱动程序的名称是必需的(最基本的要求),但设置其他选项(例如 APP='<your_application_name>' 或 ApplicationIntent= ReadOnly|ReadWrite)也很有用,可以帮助进行故障排除。
可能的键值对特定于驱动程序。 有关每个提供程序的详细信息,请参阅 CREATE EXTERNAL DATA SOURCE (Transact-SQL) CONNECTION_OPTIONS。
从 SQL Server 2022(16.x) 累积更新 2 开始,引入了其他关键字以支持 Oracle TNS 文件:
- 关键字
TNSNamesFile指定位于 Oracle 服务器上的tnsnames.ora文件的文件路径。 - 关键字
ServerName指定tnsnames.ora内使用的别名,该别名将用于替换主机名和端口。
SQL Server 2025 (17.x) 预览版中的加密选项
从 SQL Server 2025 (17.x) 预览版开始,当用作 sqlserver 数据源时,SQL Server Microsoft ODBC 驱动程序版本 18 是默认驱动程序。 该Encryption选项是必需的(Yes、或NoStrict),并且TrustServerCertificate可用(Yes或No)。 如果未 Encryption 指定,则默认行为为 Encrypt=Yes;TrustServerCertificate=No;,并且需要服务器证书。
若要使用 TDS 8.0 协议进行连接,已添加严格模式(Encrypt=Strict)。 在此模式下,需要安装受信任的服务器证书,并且始终经过验证(忽略 TrustServerCertificate)。 如果新关键字 HostnameInCertificate 与指定的服务器不同,则可用于指定在证书中找到的预期主机名。
HostnameInCertificate 在所有加密模式下都可用,并且如果启用了服务器端 强制加密 选项,这将导致驱动程序在 可选 模式或 强制 模式下验证证书,除非使用 TrustServerCertificate禁用。
有关选项、服务器证书和Encryption选项的详细信息TrustServerCertificate,请参阅 Windows 上的 Microsoft ODBC Driver for SQL Server 的功能。
应始终使用最新的驱动程序。 但是,SQL Server 2025 (17.x) 预览版还支持 Microsoft ODBC 驱动程序版本 17 for 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 门户><Your_Storage_Account>>共享访问签名>“配置权限>生成 SAS 和连接字符串”来创建 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) 读取、创建、列出和写入 对于 Azure Blob 存储和 Azure Data Lake Gen 2:
- 允许的服务:必须选择
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 上安装 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 将搜索由 tnsnames.ora 指定的 TNSNamesFile 文件位置,并搜索由 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 文件
适用于: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 存储中的数据
适用于:SQL Server 2022 (16.x) 及更高版本。
使用 Azure 存储帐户 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) 及更高版本。
使用 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 存储检索数据的批量操作
适用于: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 时,必须使用 Encryption 下面的 CONNECTION_OPTIONS选项,并且 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 Database
适用于: 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 Edge 中可用。 EdgeHub 始终位于 Azure SQL Edge 实例的本地。 因此,无需指定路径或端口值。 |
| Kafka | kafka |
kafka://<kafka_bootstrap_server_name_ip>:<port_number> |
仅在 Azure SQL Edge 中可用。 |
| 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 SIGNATURETYPE = 的 BLOB_STORAGE 的示例,请参阅创建外部数据源以执行批量操作并将数据从 Azure 存储检索到 SQL 数据库
若要创建数据库范围的凭据,请参阅 CREATE DATABASE SCOPED CREDENTIAL。
TYPE = * [ BLOB_STORAGE |RDBMS |SHARD_MAP_MANAGER ] *
指定要配置的外部数据源的类型。 此参数并非始终是必需的,只应为某些外部数据源提供。
- 使用
RDBMS通过 SQL 数据库中的弹性查询进行跨数据库查询。 - 连接到分片的 SQL 数据库时,请使用
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 对象采用共享锁。
示例
答: 创建分片映射管理器外部数据源
若要创建外部数据源来引用 SHARD_MAP_MANAGER,请指定托管 SQL 数据库中的分片映射管理器或虚拟机上的 SQL Server 数据库的 SQL 数据库服务器名称。
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
适用范围:仅限 Azure SQL Edge
在本示例中,外部数据源是 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
适用范围:仅限 Azure SQL Edge
在本示例中,外部数据源是在与 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 资源,请参阅 Azure SQL 数据库的 CREATE EXTERNAL DATA SOURCE。
语法
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 或 Azure Data Lake Store Gen 2。
Azure Synapse Analytics 中的无服务器和专用 SQL 池使用不同的代码库执行数据虚拟化。 无服务器 SQL 池支持本机数据虚拟化技术。 专用 SQL 池支持本机和 PolyBase 数据虚拟化。 使用 TYPE=HADOOP 创建 EXTERNAL DATA SOURCE 时,将使用 PolyBase 数据虚拟化。
权限
需要对数据库拥有 CONTROL 权限。
锁定
对 EXTERNAL DATA SOURCE 对象采用共享锁。
安全性
大多数外部数据源支持使用数据库范围的凭据创建代理帐户,从而执行基于代理的身份验证。
共享访问签名 (SAS) 密钥支持对 Azure Data Lake Store Gen 2 存储帐户进行身份验证。 想要使用共享访问签名进行身份验证的客户必须在 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)进行身份验证。
此示例使用基于 Java 的旧 HADOOP 访问方法。 下面的示例演示如何创建数据库范围凭据以用于对 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 (
LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
B. 创建外部数据源以使用服务主体引用 Azure Data Lake Store Gen 1 或 Azure Data Lake Store Gen 2
Azure Data Lake Store 连接可以基于 ADLS URI 和 Microsoft Entra 应用程序的服务主体。 有关创建此应用程序的文档,可以使用 Microsoft Entra ID 在 Data Lake Store 身份验证中找到。
-- 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 (
LOCATION = 'adl://newyorktaxidataset.azuredatalakestore.net',
CREDENTIAL = ADLS_credential,
TYPE = HADOOP
);
-- 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
LOCATION = 'abfss://data@newyorktaxidataset.dfs.core.windows.net',
CREDENTIAL = ADLS_credential,
TYPE = HADOOP
);
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 帐户时,无需指定 SECRET。
-- 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 配合使用。
语法
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。
TYPE = * [ 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 |
| 资源管理器作业提交(Windows 上的 Hortonworks 2.0,Linux 上的 Cloudera 5.x) | 8032 |
| 资源管理器作业提交(Linux 上的 Hortonworks 2.x、3.0,Windows 上的 Hortonworks 2.1-3) | 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 (
LOCATION = 'hdfs://10.10.10.10:8050',
TYPE = HADOOP
);
B. 创建外部数据源以引用 Hadoop 并启用下推
指定 RESOURCE_MANAGER_LOCATION 选项以便为 PolyBase 查询启用到 Hadoop 的下推计算。 启用后,PolyBase 会根据成本作出决策,以确定是否应将查询计算下推到 Hadoop。
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8020',
TYPE = HADOOP,
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 (
LOCATION = 'hdfs://10.10.10.10:8050',
CREDENTIAL = HadoopUser1,
TYPE = HADOOP,
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 (
LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
相关内容
* SQL 托管实例 *
概述:Azure SQL 托管实例
适用于: Azure SQL 托管实例
在 Azure SQL 托管实例中创建外部数据源。 有关完整信息,请参阅 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 (Transact-SQL)。
对数据库范围的凭据使用托管服务标识:
指定
WITH IDENTITY = 'Managed Identity'使用 Azure SQL 托管实例的系统分配托管服务标识,如果要用于此目的,则必须启用该标识。
- 将访问必要 Azure Blob 存储容器所需的 Azure RBAC 角色“读者”授予 Azure SQL 托管实例的系统分配的托管服务标识。 例如,若要通过 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 对象采用共享锁。
示例
有关更多示例,请参阅 Azure SQL 托管实例的数据虚拟化。
答: 使用 OPENROWSET 或外部表从 Azure SQL 托管实例查询外部数据
有关更多示例,请参阅 CREATE EXTERNAL DATA SOURCE ,或使用 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 *
概述:Microsoft Fabric
适用于:Fabric 数据仓库
创建外部数据源。
语法
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 存储,主体必须在容器或存储帐户级别分配 存储 Blob 数据读取者 角色(或更高版本)。
- 对于 Fabric One Lake 存储,主体必须具有“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;