CREATE EXTERNAL DATA SOURCE (Transact-SQL)

Crea un origen de datos externo para realizar consultas mediante SQL Server, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, Analytics Platform System (PDW) o Azure SQL Edge.

En este artículo se proporciona la sintaxis, argumentos, comentarios, permisos y ejemplos para cualquier producto SQL que elija.

Selección de un producto

En la fila siguiente, seleccione el nombre del producto que le interese; de esta manera, solo se mostrará la información de ese producto.

Información general (SQL Server 2016)

Se aplica a: SQL Server 2016 (13.x) y versiones posteriores

Crea un origen de datos externo para consultas de PolyBase. Los orígenes de datos externos se usan para establecer la conectividad y admiten estos casos de uso principales:

  • Virtualización y carga de datos mediante PolyBase
  • Operaciones de carga masiva con BULK INSERT o OPENROWSET

Nota

Esta sintaxis varía en las diferentes versiones de SQL Server. Use la lista desplegable del selector de versiones para elegir la versión adecuada.
Para ver las características de SQL Server 2019 (15.x), visite CREATE EXTERNAL DATA SOURCE. Para ver las características de SQL Server 2022 (16.x), visite CREATE EXTERNAL DATA SOURCE.

Sintaxis para SQL Server 2016

Para más información sobre las convenciones de sintaxis, vea Convenciones de sintaxis de Transact-SQL.

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

Argumentos

data_source_name

Especifica el nombre definido por el usuario para el origen de datos. El nombre debe ser único en la base de datos en SQL Server.

LOCATION = '<prefix>://<path[:port]>'

Proporciona el protocolo de conectividad y la ruta de acceso al origen de datos externo.

Origen de datos externo Prefijo de ubicación del conector Ruta de acceso de ubicación Ubicaciones admitidas por producto o servicio Authentication
Cloudera CDH o Hortonworks HDP hdfs <Namenode>[:port] SQL Server 2016 (13.x) a SQL Server 2019 (15.x) Autenticación anónima o básica
Cuenta de Azure Storage (V2) wasb[s] <container>@<storage_account>.blob.core.windows.net A partir de SQL Server 2016 (13.x)
No se admite el espacio de nombres jerárquico
Clave de cuenta de Azure Storage

Ruta de acceso de ubicación:

  • <Namenode>: nombre de equipo, nombre de URI de servicio o dirección IP de Namenode en el clúster de Hadoop. PolyBase debe resolver los nombres DNS utilizados por el clúster de Hadoop.
  • port = el puerto en el cual escucha el origen de datos externo. En Hadoop, el puerto se puede encontrar mediante el parámetro de configuración fs.defaultFS. El valor predeterminado es 8020.
  • <container> = el contenedor de la cuenta de almacenamiento que contiene los datos. Los contenedores raíz son de solo lectura, no se pueden volver a escribir datos en el contenedor.
  • <storage_account> = nombre de la cuenta de almacenamiento del recurso de Azure.
  • <server_name> = el nombre de host.
  • <instance_name> = el nombre de la instancia con nombre de SQL Server. Se usa si tiene el servicio de SQL Server Browser en ejecución en la instancia de destino.

Instrucciones y notas adicionales cuando se establece la ubicación:

  • El motor de base de datos de SQL Server no comprueba la existencia del origen de datos externo cuando se crea el objeto. Para la validación, crea una tabla externa utilizando el origen de datos externo.
  • Para garantizar una semántica de consulta coherente, use el mismo origen de datos externo para todas las tablas cuando realice consultas a Hadoop.
  • El uso de wasbs es opcional, pero se recomienda en SQL Server 2016 (13.x) para acceder a las cuentas de Azure Storage, ya que los datos se enviarán mediante una conexión TLS/SSL segura.
  • Para garantizar que las consultas de PolyBase son correctas durante una conmutación por error del Namenode de Hadoop, considere la posibilidad de usar una dirección IP virtual para el Namenode del clúster de Hadoop. Si no, ejecute un comando ALTER EXTERNAL DATA SOURCE para que apunte a la nueva ubicación.

CREDENTIAL = credential_name

Especifica una credencial de ámbito de base de datos para la autenticación en el origen de datos externo.

CREDENTIAL solo se necesita si se han protegido los datos. CREDENTIAL no es necesario para los conjuntos de datos que permiten el acceso anónimo.

Para crear una credencial con ámbito de base de datos, vea CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL).

TYPE = [ HADOOP ]

Especifica el tipo de origen de datos externo que se está configurando. En SQL Server 2016, este parámetro siempre es necesario y solo debe especificarse como HADOOP. Admite conexiones a Cloudera CDH, Hortonworks HDP o a una cuenta de Azure Storage. El comportamiento de este parámetro es diferente en versiones posteriores de SQL Server.

Para obtener un ejemplo de uso TYPE = HADOOP para cargar datos desde una cuenta de Azure Storage, consulte Creación de un origen de datos externo para acceder a los datos en Azure Storage mediante la interfaz de wasb://

RESOURCE_MANAGER_LOCATION = 'ResourceManager_URI[:port]'

Configure este valor opcional solo al conectarse a Cloudera CDH, Hortonworks HDP o una cuenta de Azure Storage. Para obtener una lista completa de las versiones de Hadoop compatibles, vea Configuración de conectividad de PolyBase (Transact-SQL).

Cuando RESOURCE_MANAGER_LOCATION está definido, el optimizador de consultas tomará una decisión basada en el costo para mejorar el rendimiento. Se puede usar un trabajo de MapReduce para insertar el cálculo en Hadoop. La especificación de RESOURCE_MANAGER_LOCATION puede reducir significativamente el volumen de datos transferidos entre Hadoop y SQL Server, lo cual puede suponer una mejora en el rendimiento de las consultas.

Si no se especifica el administrador de recursos, se deshabilita la inserción de cálculo en Hadoop para las consultas de PolyBase. En Creación de un origen de datos externo para hacer referencia a Hadoop con la inserción habilitada se proporciona un ejemplo concreto y más instrucciones.

El valor RESOURCE_MANAGER_LOCATION no se valida cuando se crea el origen de datos externo. Escribir un valor incorrecto puede provocar un error de consulta en tiempo de ejecución cada vez que se intente la inserción, ya que el valor proporcionado no podrá realizar la resolución.

Para que PolyBase funcione correctamente con un origen de datos externo de Hadoop, los puertos de los siguientes componentes del clúster de Hadoop deben estar abiertos:

  • Puertos HDFS
    • NameNode
    • DataNode
  • Administrador de recursos
    • Envío de trabajo
    • Historial de trabajos

Si no se especifica el puerto, el valor predeterminado se elige mediante el valor actual de la configuración "hadoop connectivity".

Conectividad de Hadoop Puerto predeterminado del administrador de recursos
1 50300
2 50300
3 8021
4 8032
5 8050
6 8032
7 8050
8 8032

En la tabla siguiente se muestran los puertos predeterminados para estos componentes. Hay dependencias de la versión de Hadoop, así como la posibilidad de una configuración personalizada que no use la asignación de puerto predeterminada.

Componente de clúster de Hadoop Puerto predeterminado
NameNode 8020
DataNode (transferencia de datos, puerto IPC sin privilegios) 50010
DataNode (transferencia de datos, puerto IPC con privilegios) 1019
Envío de trabajos de Resource Manager (Hortonworks 1.3) 50300
Envío de trabajos de Resource Manager (Cloudera 4.3) 8021
Envío de trabajos de Resource Manager (Hortonworks 2.0 en Windows, Cloudera 5.x en Linux) 8032
Envío de trabajos de Resource Manager (Hortonworks 2.x, 3.0 en Linux, Hortonworks 2.1-3 en Windows) 8050
Historial de trabajos de Resource Manager 10020

Permisos

Requiere el permiso CONTROL en la base de datos en SQL Server.

Bloqueo

Toma un bloqueo compartido en el objeto EXTERNAL DATA SOURCE.

Seguridad

PolyBase es compatible con la autenticación basada en proxy para la mayoría de orígenes de datos externos. Cree una credencial con ámbito de base de datos para crear la cuenta de proxy.

Ejemplos

Importante

Para obtener información sobre cómo instalar y habilitar PolyBase, vea Instalación de PolyBase en Windows

A. Creación de un origen de datos externo para hacer referencia a Hadoop

Si quiere crear un origen de datos externo para hacer referencia al clúster de Hadoop de Hortonworks HDP o Cloudera CDH, especifique el nombre de equipo o la dirección IP de Namenode y puerto de Hadoop.

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

B. Creación de un origen de datos externo para hacer referencia a Hadoop con la inserción habilitada

Especifique la opción RESOURCE_MANAGER_LOCATION para habilitar la inserción de cálculo en Hadoop para las consultas de PolyBase. Una vez habilitado, PolyBase toma una decisión basada en el coste para determinar si se debe aplicar el cálculo de la consulta en 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. Creación de un origen de datos externo para hacer referencia a Hadoop con protección de Kerberos

Para comprobar si el clúster de Hadoop está protegido con Kerberos, compruebe el valor de la propiedad hadoop.security.authentication en core-site.xml de Hadoop. Para hacer referencia a un clúster de Hadoop protegido con Kerberos, debe especificar una credencial con ámbito de base de datos que contenga el nombre de usuario y la contraseña de Kerberos. La clave maestra de base de datos se usa para cifrar el secreto de la credencial de ámbito de base de datos.

-- 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. Creación de un origen de datos externo para acceder a los datos de Azure Storage mediante la interfaz wasb://

En este ejemplo, el origen de datos externo es una cuenta de Azure Storage (V2) denominada logs. El contenedor de almacenamiento se denomina daily. El origen de datos externo de Azure Storage es solo para la transferencia de datos. No admite la inserción de predicado. No se admiten espacios de nombres jerárquicos al acceder a los datos mediante la interfaz de wasb://.

En este ejemplo se muestra cómo crear la credencial de ámbito de base de datos para la autenticación en una cuenta de Azure Storage (V2). Especifique la clave de la cuenta de Azure Storage en el secreto de la credencial de base de datos. Puede especificar cualquier cadena en la identidad de la credencial con ámbito de base de datos, ya que no se usará para la autenticación en Azure Storage. Tenga en cuenta que al conectarse a la instancia de Azure Storage mediante el conector WASB,la autenticación debe realizarse con una clave de cuenta de almacenamiento, no con una firma de acceso compartido (SAS).

En SQL Server 2016 (13.x), TYPE se debe establecer en HADOOP incluso al acceder a Azure Storage.

-- 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
);

Pasos siguientes

Información general (SQL Server 2017)

Se aplica a: SQL Server 2017 (14.x) solo

Crea un origen de datos externo para consultas de PolyBase. Los orígenes de datos externos se usan para establecer la conectividad y admiten estos casos de uso principales:

  • Virtualización y carga de datos mediante PolyBase
  • Operaciones de carga masiva con BULK INSERT o OPENROWSET

Nota

Esta sintaxis varía en las diferentes versiones de SQL Server en Linux. Use la lista desplegable del selector de versiones para elegir la versión adecuada.
Para ver las características de SQL Server 2019 (15.x), visite CREATE EXTERNAL DATA SOURCE. Para ver las características de SQL Server 2022 (16.x), visite CREATE EXTERNAL DATA SOURCE.

Nota

Esta sintaxis varía en las diferentes versiones de SQL Server. Use la lista desplegable del selector de versiones para elegir la versión adecuada.
Para ver las características de SQL Server 2019 (15.x), visite CREATE EXTERNAL DATA SOURCE. Para ver las características de SQL Server 2022 (16.x), visite CREATE EXTERNAL DATA SOURCE.

Sintaxis para SQL Server 2017

Para más información sobre las convenciones de sintaxis, vea Convenciones de sintaxis de Transact-SQL.

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>]' )
[ ; ]

Argumentos

data_source_name

Especifica el nombre definido por el usuario para el origen de datos. El nombre debe ser único en la base de datos en SQL Server.

LOCATION = '<prefix>://<path[:port]>'

Proporciona el protocolo de conectividad y la ruta de acceso al origen de datos externo.

Origen de datos externo Prefijo de ubicación del conector Ruta de acceso de ubicación Ubicaciones admitidas por producto o servicio Authentication
Cloudera CDH o Hortonworks HDP hdfs <Namenode>[:port] SQL Server 2016 (13.x) solo a SQL Server 2019 (15.x) Autenticación anónima o básica
Cuenta de Azure Storage (V2) wasb[s] <container>@<storage_account>.blob.core.windows.net A partir de SQL Server 2016 (13.x)
No se admite el espacio de nombres jerárquico
Clave de cuenta de Azure Storage
Operaciones masivas https <storage_account>.blob.core.windows.net/<container> A partir de SQL Server 2017 (14.x) Firma de acceso compartido (SAS)

Ruta de acceso de ubicación:

  • <NameNode>: nombre de equipo, nombre de URI de servicio o dirección IP del Namenode en el clúster de Hadoop. PolyBase debe resolver los nombres DNS utilizados por el clúster de Hadoop.
  • port = el puerto en el cual escucha el origen de datos externo. En Hadoop, el puerto se puede encontrar mediante el parámetro de configuración fs.defaultFS. El valor predeterminado es 8020.
  • <container> = el contenedor de la cuenta de almacenamiento que contiene los datos. Los contenedores raíz son de solo lectura, no se pueden volver a escribir datos en el contenedor.
  • <storage_account> = nombre de la cuenta de almacenamiento del recurso de Azure.
  • <server_name> = el nombre de host.
  • <instance_name> = el nombre de la instancia con nombre de SQL Server. Se usa si tiene el servicio de SQL Server Browser en ejecución en la instancia de destino.

Instrucciones y notas adicionales cuando se establece la ubicación:

  • El motor de base de datos de SQL Server no comprueba la existencia del origen de datos externo cuando se crea el objeto. Para la validación, crea una tabla externa utilizando el origen de datos externo.
  • Para garantizar una semántica de consulta coherente, use el mismo origen de datos externo para todas las tablas cuando realice consultas a Hadoop.
  • Especifique Driver={<Name of Driver>} al conectarse a través de ODBC.
  • El uso de wasbs es opcional, pero se recomienda en SQL Server 2017 (14.x) para acceder a las cuentas de Azure Storage, ya que los datos se enviarán mediante una conexión TLS/SSL segura.
  • Para garantizar que las consultas de PolyBase son correctas durante una conmutación por error del Namenode de Hadoop, considere la posibilidad de usar una dirección IP virtual para el Namenode del clúster de Hadoop. Si no, ejecute un comando ALTER EXTERNAL DATA SOURCE para que apunte a la nueva ubicación.

CREDENTIAL = credential_name

Especifica una credencial de ámbito de base de datos para la autenticación en el origen de datos externo.

Instrucciones y notas adicionales cuando se crea una credencial:

  • CREDENTIAL solo se necesita si se han protegido los datos. CREDENTIAL no es necesario para los conjuntos de datos que permiten el acceso anónimo.
  • Cuando TYPE = BLOB_STORAGE, la credencial debe crearse mediante el uso de SHARED ACCESS SIGNATURE como identidad.
  • TYPE = BLOB_STORAGE solo se permite para operaciones masivas; no se pueden crear tablas externas para un origen de datos externo con TYPE = BLOB_STORAGE.
  • Tenga en cuenta que al conectarse a la instancia de Azure Storage mediante el conector WASB,la autenticación debe realizarse con una clave de cuenta de almacenamiento, no con una firma de acceso compartido (SAS).
  • Cuando TYPE = HADOOP, la credencial debe crearse con la clave de la cuenta de almacenamiento como SECRET.

Hay varias maneras de crear una firma de acceso compartido:

  • Puede crear un token de SAS; para ello, vaya a Azure Portal ><Su_cuenta_de_almacenamiento> -> Firma de acceso compartido -> Configurar permisos -> Generar la cadena de conexión y SAS. Para más información, consulte Generación de una firma de acceso compartido.

  • Puede crear y configurar una SAS con Explorador de Azure Storage.

  • Puede crear una SAS mediante programación a través de PowerShell, la CLI de Azure, .NET y la API de REST. Para obtener más información, consulte Otorgar acceso limitado a recursos de Azure Storage con firmas de acceso compartido (SAS).

  • El token de SAS debe configurarse del modo siguiente:

    • Cuando se genera un token de SAS, este incluye un signo de interrogación ("?") al principio del token. Excluya el ? inicial cuando se configura como SECRET.
    • Usar un período de caducidad válido (todas las fechas se encuentran en hora UTC).
    • Conceder al menos permiso de lectura en el archivo que se debe cargar (por ejemplo, srt=o&sp=r). Se pueden crear varias firmas de acceso compartido para diferentes casos de uso. Los permisos se deben conceder de la siguiente manera:
    Acción Permiso
    Leer datos desde un archivo Lectura
    Leer datos de varios archivos y subcarpetas Lectura y enumeración

Para obtener un ejemplo del uso de CREDENTIAL con SHARED ACCESS SIGNATURE y TYPE = BLOB_STORAGE, vea Creación de un origen de datos externo para ejecutar operaciones masivas y recuperar datos desde Azure Storage en SQL Database.

Para crear una credencial con ámbito de base de datos, vea CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL).

TYPE = [ HADOOP | BLOB_STORAGE ]

Especifica el tipo de origen de datos externo que se está configurando. Este parámetro no siempre es necesario y solo se debe especificar al conectarse a Cloudera CDH, Hortonworks HDP, una cuenta de Azure Storage o una instancia de Azure Data Lake Storage Gen2.

  • Use HADOOP cuando el origen de datos externo sea Cloudera CDH, Hortonworks HDP, una cuenta de Azure Storage o una instancia de Azure Data Lake Storage Gen2.
  • Use BLOB_STORAGE al ejecutar operaciones masivas desde una cuenta de Azure Storage mediante BULK INSERT u OPENROWSET. Opción introducida con SQL Server 2017 (14.x). Se usa HADOOP cuando se pretende crear una tabla externa en Azure Storage.

Nota

TYPE se debe establecer en HADOOP incluso al acceder a Azure Storage.

Para obtener un ejemplo de uso TYPE = HADOOP para cargar datos desde una cuenta de Azure Storage, consulte Creación de un origen de datos externo para acceder a los datos en Azure Storage mediante la interfaz de wasb://

RESOURCE_MANAGER_LOCATION = 'ResourceManager_URI[:port]'

Configure este valor opcional solo al conectarse a Cloudera CDH, Hortonworks HDP o una cuenta de Azure Storage. Para obtener una lista completa de las versiones de Hadoop compatibles, vea Configuración de conectividad de PolyBase (Transact-SQL).

Cuando RESOURCE_MANAGER_LOCATION está definido, el optimizador de consultas toma una decisión basada en el coste para mejorar el rendimiento. Se puede usar un trabajo de MapReduce para insertar el cálculo en Hadoop. La especificación de RESOURCE_MANAGER_LOCATION puede reducir significativamente el volumen de datos transferidos entre Hadoop y SQL Server, lo cual puede suponer una mejora en el rendimiento de las consultas.

Si no se especifica el administrador de recursos, se deshabilita la inserción de cálculo en Hadoop para las consultas de PolyBase. En Creación de un origen de datos externo para hacer referencia a Hadoop con la inserción habilitada se proporciona un ejemplo concreto y más instrucciones.

El valor RESOURCE_MANAGER_LOCATION no se valida cuando se crea el origen de datos externo. Escribir un valor incorrecto puede provocar un error de consulta en tiempo de ejecución cada vez que se intente la inserción, ya que el valor proporcionado no podrá realizar la resolución.

Para que PolyBase funcione correctamente con un origen de datos externo de Hadoop, los puertos de los siguientes componentes del clúster de Hadoop deben estar abiertos:

  • Puertos HDFS
    • NameNode
    • DataNode
  • Administrador de recursos
    • Envío de trabajo
    • Historial de trabajos

Si no se especifica el puerto, el valor predeterminado se elige mediante el valor actual de la configuración "hadoop connectivity".

Conectividad de Hadoop Puerto predeterminado del administrador de recursos
1 50300
2 50300
3 8021
4 8032
5 8050
6 8032
7 8050
8 8032

En la tabla siguiente se muestran los puertos predeterminados para estos componentes. Tenga en cuenta que hay dependencias de la versión de Hadoop, así como la posibilidad de una configuración personalizada que no use la asignación de puerto predeterminada.

Componente de clúster de Hadoop Puerto predeterminado
NameNode 8020
DataNode (transferencia de datos, puerto IPC sin privilegios) 50010
DataNode (transferencia de datos, puerto IPC con privilegios) 1019
Envío de trabajos de Resource Manager (Hortonworks 1.3) 50300
Envío de trabajos de Resource Manager (Cloudera 4.3) 8021
Envío de trabajos de Resource Manager (Hortonworks 2.0 en Windows, Cloudera 5.x en Linux) 8032
Envío de trabajos de Resource Manager (Hortonworks 2.x, 3.0 en Linux, Hortonworks 2.1-3 en Windows) 8050
Historial de trabajos de Resource Manager 10020

Permisos

Requiere el permiso CONTROL en la base de datos en SQL Server.

Bloqueo

Toma un bloqueo compartido en el objeto EXTERNAL DATA SOURCE.

Seguridad

PolyBase es compatible con la autenticación basada en proxy para la mayoría de orígenes de datos externos. Cree una credencial con ámbito de base de datos para crear la cuenta de proxy.

No se admite un token de SAS con el tipo HADOOP. Solo se admite con el tipo = BLOB_STORAGE cuando se usa en su lugar una clave de acceso de la cuenta de almacenamiento. Si se intenta crear un origen de datos externo con el tipo HADOOP y una credencial SAS, aparece un error como el siguiente:

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 are not valid.: Error [Parameters provided to connect to the Azure storage account are not valid.] occurred while accessing external file.'

Ejemplos

Importante

Para obtener información sobre cómo instalar y habilitar PolyBase, vea Instalación de PolyBase en Windows

A. Creación de un origen de datos externo para hacer referencia a Hadoop

Si quiere crear un origen de datos externo para hacer referencia al clúster de Hadoop de Hortonworks HDP o Cloudera CDH, especifique el nombre de equipo o la dirección IP de Namenode y puerto de Hadoop.

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

B. Creación de un origen de datos externo para hacer referencia a Hadoop con la inserción habilitada

Especifique la opción RESOURCE_MANAGER_LOCATION para habilitar la inserción de cálculo en Hadoop para las consultas de PolyBase. Una vez habilitado, PolyBase toma una decisión basada en el coste para determinar si se debe aplicar el cálculo de la consulta en 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. Creación de un origen de datos externo para hacer referencia a Hadoop con protección de Kerberos

Para comprobar si el clúster de Hadoop está protegido con Kerberos, compruebe el valor de la propiedad hadoop.security.authentication en core-site.xml de Hadoop. Para hacer referencia a un clúster de Hadoop protegido con Kerberos, debe especificar una credencial con ámbito de base de datos que contenga el nombre de usuario y la contraseña de Kerberos. La clave maestra de base de datos se usa para cifrar el secreto de la credencial de ámbito de base de datos.

-- 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. Creación de un origen de datos externo para acceder a los datos de Azure Storage mediante la interfaz wasb://

En este ejemplo, el origen de datos externo es una cuenta de Azure Storage (V2) denominada logs. El contenedor de almacenamiento se denomina daily. El origen de datos externo de Azure Storage es solo para la transferencia de datos. No admite la inserción de predicado. No se admiten espacios de nombres jerárquicos al acceder a los datos mediante la interfaz de wasb://. Tenga en cuenta que al conectarse a la instancia de Azure Storage mediante el conector WASB,la autenticación debe realizarse con una clave de cuenta de almacenamiento, no con una firma de acceso compartido (SAS).

En este ejemplo se muestra cómo crear la credencial de ámbito de base de datos para la autenticación en una cuenta de Azure Storage (V2). Especifique la clave de la cuenta de Azure Storage en el secreto de la credencial de base de datos. Puede especificar cualquier cadena en la identidad de la credencial con ámbito de base de datos, ya que no se usará para la autenticación en Azure Storage.

-- 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
);

Ejemplos: operaciones masivas

Importante

No coloque un / final, nombre de archivo o parámetros de firma de acceso compartido al final de la dirección URL de LOCATION al configurar un origen de datos externo para las operaciones masivas.

E. Creación de un origen de datos externo para operaciones masivas de recuperación de datos desde Azure Storage

Se aplica a: SQL Server 2017 (14.x) y versiones posteriores.

Use el origen de datos siguiente para las operaciones masivas con BULK INSERT o OPENROWSET. La credencial debe establecer SHARED ACCESS SIGNATURE como identidad, no debe tener al inicio ? en el token de SAS, debe tener al menos permiso de lectura en el archivo que se debe cargar (por ejemplo srt=o&sp=r), y el período de expiración debe ser válido (todas las fechas se expresan en hora UTC). Para más información sobre las firmas de acceso compartido, vea Uso de Firmas de acceso compartido (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
);

Para ver este ejemplo en uso, vea el ejemplo BULK INSERT.

Pasos siguientes

Información general (SQL Server 2019)

Se aplica a: SQL Server 2019 (15.x) y versiones posteriores

Crea un origen de datos externo para consultas de PolyBase. Los orígenes de datos externos se usan para establecer la conectividad y admiten estos casos de uso principales:

  • Virtualización y carga de datos mediante PolyBase
  • Operaciones de carga masiva con BULK INSERT o OPENROWSET

Nota

Esta sintaxis varía en las diferentes versiones de SQL Server. Use la lista desplegable del selector de versiones para elegir la versión adecuada.
Para ver las características de SQL Server 2022 (16.x), visite CREATE EXTERNAL DATA SOURCE.

Nota

Esta sintaxis varía en las diferentes versiones de SQL Server. Use la lista desplegable del selector de versiones para elegir la versión adecuada.
Para ver las características de SQL Server 2022 (16.x), visite CREATE EXTERNAL DATA SOURCE.

Sintaxis para SQL Server 2019

Para más información sobre las convenciones de sintaxis, vea Convenciones de sintaxis de 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 } ]
    [ [ , ] TYPE = { HADOOP | BLOB_STORAGE } ]
    [ [ , ] RESOURCE_MANAGER_LOCATION = '<resource_manager>[:<port>]' )
[ ; ]

Argumentos

data_source_name

Especifica el nombre definido por el usuario para el origen de datos. El nombre debe ser único en la base de datos en SQL Server.

LOCATION = '<prefix>://<path[:port]>'

Proporciona el protocolo de conectividad y la ruta de acceso al origen de datos externo.

Origen de datos externo Prefijo de ubicación del conector Ruta de acceso de ubicación Ubicaciones admitidas por producto o servicio Authentication
Cloudera CDH o Hortonworks HDP hdfs <Namenode>[:port] SQL Server 2016 (13.x) a SQL Server 2019 (15.x) Autenticación anónima o básica
Cuenta de Azure Storage (V2) wasb[s] <container>@<storage_account>.blob.core.windows.net A partir de SQL Server 2016 (13.x)
No se admite el espacio de nombres jerárquico
Clave de cuenta de Azure Storage
SQL Server sqlserver <server_name>[\<instance_name>][:port] A partir de SQL Server 2019 (15.x) Solo autenticación SQL
Oracle oracle <server_name>[:port] A partir de SQL Server 2019 (15.x) Solo autenticación básica
Teradata teradata <server_name>[:port] A partir de SQL Server 2019 (15.x) Solo autenticación básica
MongoDB o API de Cosmos DB para MongoDB mongodb <server_name>[:port] A partir de SQL Server 2019 (15.x) Solo autenticación básica
ODBC genérico odbc <server_name>[:port] A partir de SQL Server 2019 (15.x): solo Windows Solo autenticación básica
Operaciones masivas https <storage_account>.blob.core.windows.net/<container> A partir de SQL Server 2017 (14.x) Firma de acceso compartido (SAS)
Azure Data Lake Storage Gen2 abfs[s] abfss://<container>@<storage _account>.dfs.core.windows.net A partir de SQL Server 2019 (15.x) CU11+. Clave de acceso de almacenamiento
Grupo de datos de Clústeres de macrodatos de SQL Server sqldatapool sqldatapool://controller-svc/default Solo se admite en Clústeres de macrodatos de SQL Server 2019 Solo autenticación básica
Bloque de almacenamiento en Clústeres de macrodatos de SQL Server sqlhdfs sqlhdfs://controller-svc/default Solo se admite en Clústeres de macrodatos de SQL Server 2019 Solo autenticación básica

Ruta de acceso de ubicación:

  • <Namenode>: nombre de equipo, nombre de URI de servicio o dirección IP de Namenode en el clúster de Hadoop. PolyBase debe resolver los nombres DNS utilizados por el clúster de Hadoop.
  • port = el puerto en el cual escucha el origen de datos externo. En Hadoop, el puerto se puede encontrar mediante el parámetro de configuración fs.defaultFS. El valor predeterminado es 8020.
  • <container> = el contenedor de la cuenta de almacenamiento que contiene los datos. Los contenedores raíz son de solo lectura, no se pueden volver a escribir datos en el contenedor.
  • <storage_account> = nombre de la cuenta de almacenamiento del recurso de Azure.
  • <server_name> = el nombre de host.
  • <instance_name> = el nombre de la instancia con nombre de SQL Server. Se usa si tiene el servicio de SQL Server Browser en ejecución en la instancia de destino.

Instrucciones y notas adicionales cuando se establece la ubicación:

  • El motor de base de datos de SQL Server no comprueba la existencia del origen de datos externo cuando se crea el objeto. Para la validación, crea una tabla externa utilizando el origen de datos externo.
  • Para garantizar una semántica de consulta coherente, use el mismo origen de datos externo para todas las tablas cuando realice consultas a Hadoop.
  • Puede usar el conector sqlserver para conectar SQL Server 2019 (15.x) a otro SQL Server o a Azure SQL Database.
  • Especifique Driver={<Name of Driver>} al conectarse a través de ODBC.
  • El uso de wasbs o abfss es opcional, pero se recomienda en SQL Server 2019 (15.x) para acceder a las cuentas de Azure Storage, ya que los datos se enviarán mediante una conexión TLS/SSL segura.
  • Las API abfs o abfss se admiten al acceder a las cuentas de Azure Storage a partir de SQL Server 2019 (15.x) CU11. Para obtener más información, vea Controlador Azure Blob File System (ABFS).
  • La opción Espacio de nombres jerárquico para cuentas de Azure Storage (V2) mediante abfs[s] se admite a través de Azure Data Lake Storage Gen2 a partir de SQL Server 2019 (15.x) CU11+. De lo contrario, no se admite la opción Espacio de nombres jerárquico y debe permanecer deshabilitada.
  • Para garantizar que las consultas de PolyBase son correctas durante una conmutación por error del Namenode de Hadoop, considere la posibilidad de usar una dirección IP virtual para el Namenode del clúster de Hadoop. Si no, ejecute un comando ALTER EXTERNAL DATA SOURCE para que apunte a la nueva ubicación.
  • Se admiten los tipos sqlhdfs y sqldatapool para conectarse entre la instancia maestra y el grupo de almacenamiento de un clúster de macrodatos. Use hdfs para Cloudera CDH o Hortonworks HDP. Para obtener más información sobre el uso de sqlhdfs para consultar grupos de almacenamiento de clústeres de macrodatos de SQL Server, consulte Tutorial: consultar HDFS en un clúster de macrodatos de SQL Server 2019.
  • La compatibilidad de SQL Server con los orígenes de datos externos HDFS Cloudera (CDP) y Hortonworks (HDP) se retirará y no se incluirá en SQL Server 2022 (16.x). Para obtener más información, consulte Opciones de macrodatos en la plataforma Microsoft SQL Server.

CONNECTION_OPTIONS = key_value_pair

Se especifica para SQL Server 2019 (15.x) y versiones posteriores. Especifica opciones adicionales al conectarse a través de ODBC a un origen de datos externo. Para usar varias opciones de conexión, sepárelas mediante punto y coma.

Se aplica a las conexiones ODBC genéricas, así como a los conectores ODBC integrados para SQL Server, Oracle, Teradata, MongoDB y la API de Azure Cosmos DB para MongoDB.

key_value_pair es la palabra clave y el valor de una opción de conexión específica. Las palabras clave y los valores disponibles dependen del tipo de origen de datos externo. Se requiere como mínimo el nombre del controlador, pero existen otras opciones, como APP='<your_application_name>' o ApplicationIntent= ReadOnly|ReadWrite, que también resulta útil establecerlas y pueden ayudarle con la solución de problemas.

Los posibles pares clave-valor son específicos del proveedor de origen de datos externo. Para más información sobre cada proveedor, consulte CREATE EXTERNAL DATA SOURCE (Transact-SQL) CONNECTION_OPTIONS.

A partir de la actualización acumulativa 19 de SQL Server 2019 (15.x), se han introducido palabras clave adicionales para admitir archivos TNS de Oracle:

  • La palabra clave TNSNamesFile especifica la ruta de acceso al archivo tnsnames.ora ubicado en el servidor de Oracle.
  • La palabra clave ServerName especifica el alias usado dentro del tnsnames.ora que se usará para reemplazar el nombre de host y el puerto.

Delegación = ON | OFF

Se especifica solo para SQL Server 2019 (15.x). Indica si se puede insertar cálculo en el origen de datos externo. El valor predeterminado es ON.

PUSHDOWN se admite al conectarse a SQL Server, Oracle, Teradata, MongoDB, la API Azure Cosmos DB para MongoDB u ODBC en el nivel de origen de datos externo.

Habilitar o deshabilitar la inserción en el nivel de consulta se logra a través de una sugerencia.

CREDENTIAL = credential_name

Especifica una credencial de ámbito de base de datos para la autenticación en el origen de datos externo.

Instrucciones y notas adicionales cuando se crea una credencial:

  • CREDENTIAL solo se necesita si se han protegido los datos. CREDENTIAL no es necesario para los conjuntos de datos que permiten el acceso anónimo.
  • Cuando TYPE = BLOB_STORAGE, la credencial debe crearse mediante el uso de SHARED ACCESS SIGNATURE como identidad.
    • TYPE = BLOB_STORAGE solo se permite para operaciones masivas; no se pueden crear tablas externas para un origen de datos externo con TYPE = BLOB_STORAGE.

Hay varias maneras de crear una firma de acceso compartido:

  • Puede crear un token de SAS; para ello, vaya a Azure Portal ><Su_cuenta_de_almacenamiento> -> Firma de acceso compartido -> Configurar permisos -> Generar la cadena de conexión y SAS. Para más información, consulte Generación de una firma de acceso compartido.

  • Puede crear y configurar una SAS con Explorador de Azure Storage.

  • Puede crear una SAS mediante programación a través de PowerShell, la CLI de Azure, .NET y la API de REST. Para obtener más información, consulte Otorgar acceso limitado a recursos de Azure Storage con firmas de acceso compartido (SAS).

  • El token de SAS debe configurarse del modo siguiente:

    • Cuando se genera un token de SAS, este incluye un signo de interrogación ("?") al principio del token. Excluya el ? inicial cuando se configura como SECRET.
    • Usar un período de caducidad válido (todas las fechas se encuentran en hora UTC).
    • Conceder al menos permiso de lectura en el archivo que se debe cargar (por ejemplo, srt=o&sp=r). Se pueden crear varias firmas de acceso compartido para diferentes casos de uso. Los permisos se deben conceder de la siguiente manera:
    Acción Permiso
    Leer datos desde un archivo Lectura
    Leer datos de varios archivos y subcarpetas Lectura y enumeración

Para obtener un ejemplo del uso de CREDENTIAL con SHARED ACCESS SIGNATURE y TYPE = BLOB_STORAGE, vea Creación de un origen de datos externo para ejecutar operaciones masivas y recuperar datos desde Azure Storage en SQL Database.

Para crear una credencial con ámbito de base de datos, vea CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL).

TYPE = [ HADOOP | BLOB_STORAGE ]

Especifica el tipo de origen de datos externo que se está configurando. Este parámetro no siempre es necesario y solo se debe especificar al conectarse a Cloudera CDH, Hortonworks HDP, una cuenta de Azure Storage o una instancia de Azure Data Lake Storage Gen2.

  • En SQL Server 2019 (15.x), no especifique TYPE a menos que se conecte a Cloudera CDH, Hortonworks HDP o una cuenta de Azure Storage.
  • Use HADOOP cuando el origen de datos externo sea Cloudera CDH, Hortonworks HDP, una cuenta de Azure Storage o una instancia de Azure Data Lake Storage Gen2.
  • Use BLOB_STORAGE al ejecutar operaciones masivas desde una cuenta de Azure Storage mediante BULK INSERT u OPENROWSET con SQL Server 2017 (14.x). Se usa HADOOP cuando se pretende crear una tabla externa en Azure Storage.
  • La compatibilidad de SQL Server con los orígenes de datos externos HDFS Cloudera (CDP) y Hortonworks (HDP) se retirará y no se incluirá en SQL Server 2022 (16.x). Para obtener más información, consulte Opciones de macrodatos en la plataforma Microsoft SQL Server.

Para obtener un ejemplo de uso TYPE = HADOOP para cargar datos desde una cuenta de Azure Storage, consulte Creación de un origen de datos externo para acceder a los datos en Azure Storage mediante la interfaz de wasb://

RESOURCE_MANAGER_LOCATION = 'ResourceManager_URI[:port]'

En SQL Server 2019 (15.x), no especifique RESOURCE_MANAGER_LOCATION a menos que se conecte a Cloudera CDH, Hortonworks HDP o una cuenta de Azure Storage.

Configure este valor opcional solo al conectarse a Cloudera CDH, Hortonworks HDP o una cuenta de Azure Storage. Para obtener una lista completa de las versiones de Hadoop compatibles, vea Configuración de conectividad de PolyBase (Transact-SQL).

Cuando RESOURCE_MANAGER_LOCATION está definido, el optimizador de consultas tomará una decisión basada en el costo para mejorar el rendimiento. Se puede usar un trabajo de MapReduce para insertar el cálculo en Hadoop. La especificación de RESOURCE_MANAGER_LOCATION puede reducir significativamente el volumen de datos transferidos entre Hadoop y SQL Server, lo cual puede suponer una mejora en el rendimiento de las consultas.

Si no se especifica el administrador de recursos, se deshabilita la inserción de cálculo en Hadoop para las consultas de PolyBase. En Creación de un origen de datos externo para hacer referencia a Hadoop con la inserción habilitada se proporciona un ejemplo concreto y más instrucciones.

El valor RESOURCE_MANAGER_LOCATION no se valida cuando se crea el origen de datos externo. Escribir un valor incorrecto puede provocar un error de consulta en tiempo de ejecución cada vez que se intente la inserción, ya que el valor proporcionado no podrá realizar la resolución.

Para que PolyBase funcione correctamente con un origen de datos externo de Hadoop, los puertos de los siguientes componentes del clúster de Hadoop deben estar abiertos:

  • Puertos HDFS
    • NameNode
    • DataNode
  • Administrador de recursos
    • Envío de trabajo
    • Historial de trabajos

Si no se especifica el puerto, el valor predeterminado se elige mediante el valor actual de la configuración "hadoop connectivity".

Conectividad de Hadoop Puerto predeterminado del administrador de recursos
1 50300
2 50300
3 8021
4 8032
5 8050
6 8032
7 8050
8 8032

En la tabla siguiente se muestran los puertos predeterminados para estos componentes. Tenga en cuenta que hay dependencias de la versión de Hadoop, así como la posibilidad de una configuración personalizada que no use la asignación de puerto predeterminada.

Componente de clúster de Hadoop Puerto predeterminado
NameNode 8020
DataNode (transferencia de datos, puerto IPC sin privilegios) 50010
DataNode (transferencia de datos, puerto IPC con privilegios) 1019
Envío de trabajos de Resource Manager (Hortonworks 1.3) 50300
Envío de trabajos de Resource Manager (Cloudera 4.3) 8021
Envío de trabajos de Resource Manager (Hortonworks 2.0 en Windows, Cloudera 5.x en Linux) 8032
Envío de trabajos de Resource Manager (Hortonworks 2.x, 3.0 en Linux, Hortonworks 2.1-3 en Windows) 8050
Historial de trabajos de Resource Manager 10020

Permisos

Requiere el permiso CONTROL en la base de datos en SQL Server.

Bloqueo

Toma un bloqueo compartido en el objeto EXTERNAL DATA SOURCE.

Seguridad

PolyBase es compatible con la autenticación basada en proxy para la mayoría de orígenes de datos externos. Cree una credencial con ámbito de base de datos para crear la cuenta de proxy.

Cuando se conecta al almacenamiento o al grupo de datos de un clúster de macrodatos de SQL Server 2019, las credenciales del usuario se pasan al sistema de back-end. Cree inicios de sesión en el propio grupo de datos para habilitar la autenticación de paso a través.

No se admite un token de SAS con el tipo HADOOP. Solo se admite con el tipo = BLOB_STORAGE cuando se usa en su lugar una clave de acceso de la cuenta de almacenamiento. Si se intenta crear un origen de datos externo con el tipo HADOOP y una credencial SAS, aparece un error como el siguiente:

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 are not valid.: Error [Parameters provided to connect to the Azure storage account are not valid.] occurred while accessing external file.'

Ejemplos

Importante

Para obtener información sobre cómo instalar y habilitar PolyBase, vea Instalación de PolyBase en Windows

A. Creación de un origen de datos externo en SQL Server 2019 para hacer referencia a Oracle

Para crear un origen de datos externo que haga referencia a Oracle, asegúrese de que tiene una credencial con ámbito de base de datos. También, opcionalmente, puede habilitar o deshabilitar la inserción de cálculo en este origen de datos.

-- 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
);

Opcionalmente, el origen de datos externo a Oracle puede usar la autenticación de proxy para proporcionar un control de acceso más preciso. Un usuario de proxy se puede configurar para tener acceso limitado en comparación con el usuario que se va a suplantar.

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]
);

Como alternativa, puede usar la autenticación de TNS.

A partir de la actualización acumulativa 19 de SQL Server 2019 (15.x), CREATE EXTERNAL DATA SOURCE admite ahora el uso de archivos TNS al conectarse a Oracle. El parámetro CONNECTION_OPTIONS se expandió y ahora usa TNSNamesFile y ServerName como variables para examinar el archivo tnsnames.ora y establecer la conexión con el servidor.

En el ejemplo siguiente, durante el tiempo de ejecución, SQL Server buscará la ubicación del archivo tnsnames.ora especificada por TNSNamesFile y buscará el host y el puerto de red especificados por 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'
);

Para obtener ejemplos adicionales de otros orígenes de datos, como MongoDB, vea Configuración de PolyBase para acceder a datos externos en MongoDB.

B. Creación de un origen de datos externo para hacer referencia a Hadoop

Si quiere crear un origen de datos externo para hacer referencia al clúster de Hadoop de Hortonworks HDP o Cloudera CDH, especifique el nombre de equipo o la dirección IP de Namenode y puerto de Hadoop.

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

C. Creación de un origen de datos externo para hacer referencia a Hadoop con la inserción habilitada

Especifique la opción RESOURCE_MANAGER_LOCATION para habilitar la inserción de cálculo en Hadoop para las consultas de PolyBase. Una vez habilitado, PolyBase toma una decisión basada en el coste para determinar si se debe aplicar el cálculo de la consulta en 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. Creación de un origen de datos externo para hacer referencia a Hadoop con protección de Kerberos

Para comprobar si el clúster de Hadoop está protegido con Kerberos, compruebe el valor de la propiedad hadoop.security.authentication en core-site.xml de Hadoop. Para hacer referencia a un clúster de Hadoop protegido con Kerberos, debe especificar una credencial con ámbito de base de datos que contenga el nombre de usuario y la contraseña de Kerberos. La clave maestra de base de datos se usa para cifrar el secreto de la credencial de ámbito de base de datos.

-- 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. Creación de un origen de datos externo para acceder a los datos de Azure Storage mediante la interfaz wasb://

En este ejemplo, el origen de datos externo es una cuenta de Azure Storage (V2) denominada logs. El contenedor de almacenamiento se denomina daily. El origen de datos externo de Azure Storage es solo para la transferencia de datos. No admite la inserción de predicado. No se admiten espacios de nombres jerárquicos al acceder a los datos mediante la interfaz de wasb://. Tenga en cuenta que al conectarse a la instancia de Azure Storage mediante el conector WASB,la autenticación debe realizarse con una clave de cuenta de almacenamiento, no con una firma de acceso compartido (SAS).

En este ejemplo se muestra cómo crear la credencial de ámbito de base de datos para la autenticación en una cuenta de Azure Storage (V2). Especifique la clave de la cuenta de Azure Storage en el secreto de la credencial de base de datos. Puede especificar cualquier cadena en la identidad de la credencial con ámbito de base de datos, ya que no se usará para la autenticación en Azure Storage.

-- 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. Creación de un origen de datos externo para hacer referencia a una instancia con nombre de SQL Server mediante la conectividad de PolyBase

Se aplica a: SQL Server 2019 (15.x) y versiones posteriores

Para crear un origen de datos externo que haga referencia a una instancia con nombre de SQL Server, use CONNECTION_OPTIONS para especificar el nombre de la instancia.

En el ejemplo siguiente, WINSQL2019 es el nombre de host y SQL2019 el de la instancia. 'Server=%s\SQL2019' es el par de clave-valor.

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

Como alternativa, puede usar un puerto para conectarse a una instancia predeterminada de SQL Server.

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

G. Creación de un origen de datos externo para hacer referencia a una réplica secundaria legible de un grupo de disponibilidad Always On

Se aplica a: SQL Server 2019 (15.x) y versiones posteriores

Para crear un origen de datos externo que haga referencia a una réplica secundaria legible de SQL Server, use CONNECTION_OPTIONS para especificar el ApplicationIntent=ReadOnly. Además, deberá establecer la base de datos de disponibilidad como Database={dbname} en CONNECTION_OPTIONSo establecer la base de datos de disponibilidad como la base de datos de disponibilidad como la base de datos predeterminada del inicio de sesión usado para la credencial con ámbito de base de datos. Tendrá que hacerlo en todas las réplicas de disponibilidad del grupo de disponibilidad.

En primer lugar, cree la credencial con ámbito de base de datos y almacene las credenciales para un inicio de sesión autenticado de SQL. El conector ODBC de SQL para PolyBase solo admite la autenticación básica. Para poder crear una credencial con ámbito de base de datos, la base de datos debe tener una clave maestra para proteger la credencial. Para obtener más información, vea CREATE MASTER KEY. En el ejemplo siguiente se crea una credencial con ámbito de base de datos, y se le proporciona su propio inicio de sesión y contraseña.

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

A continuación, cree el nuevo origen de datos externo.

Tanto si incluyó Database=dbname en la CONNECTION_OPTIONS base de datos de disponibilidad como la base de datos predeterminada para el inicio de sesión en la credencial con ámbito de base de datos, debe proporcionar el nombre de la base de datos a través de un nombre de tres partes en la instrucción CREATE EXTERNAL TABLE, dentro del parámetro LOCATION. Para obtener un ejemplo, vea CREATE EXTERNAL TABLE.

En el ejemplo siguiente, WINSQL2019AGL es el nombre del agente de escucha del grupo de disponibilidad y dbname es el nombre de la base de datos que será el destino de la instrucción CREATE EXTERNAL TABLE.

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

Puede demostrar el comportamiento de redireccionamiento del grupo de disponibilidad especificando ApplicationIntent y creando una tabla externa en la vista del sistema sys.servers. En el siguiente script de ejemplo, se crean dos orígenes de datos externos y se crea una tabla externa para cada uno. Use las vistas para probar qué servidor responde a la conexión. Se pueden obtener resultados similares con la característica de enrutamiento de solo lectura. Para más información, consulte Configuración del enrutamiento de solo lectura para un grupo de disponibilidad 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

Dentro de la base de datos del grupo de disponibilidad, cree una vista para devolver sys.servers y el nombre de la instancia local, lo que le ayuda a identificar qué réplica responde a la consulta. Para obtener más información, consulte sys.servers.

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

A continuación, cree una tabla externa en la instancia de origen:

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

Ejemplos: operaciones masivas

Importante

No coloque un / final, nombre de archivo o parámetros de firma de acceso compartido al final de la dirección URL de LOCATION al configurar un origen de datos externo para las operaciones masivas.

H. Creación de un origen de datos externo para operaciones masivas de recuperación de datos desde Azure Storage

Se aplica a: SQL Server 2017 (14.x) y SQL Server 2019 (15.x)

Use el origen de datos siguiente para las operaciones masivas con BULK INSERT o OPENROWSET. La credencial debe establecer SHARED ACCESS SIGNATURE como identidad, no debe tener al inicio ? en el token de SAS, debe tener al menos permiso de lectura en el archivo que se debe cargar (por ejemplo srt=o&sp=r), y el período de expiración debe ser válido (todas las fechas se expresan en hora UTC). Para más información sobre las firmas de acceso compartido, vea Uso de Firmas de acceso compartido (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
);

Para ver este ejemplo en uso, vea el ejemplo BULK INSERT.

I. Creación de un origen de datos externo para acceder a los datos de Azure Storage mediante la interfaz abfs://

Se aplica a: SQL Server 2019 (15.x) CU11 y versiones posteriores

En este ejemplo, el origen de datos externo es una cuenta de Azure Data Lake Storage Gen2 logs, con el controlador Azure Blob Filesystem (ABFS). El contenedor de almacenamiento se denomina daily. El origen de datos externo de Azure Data Lake Storage Gen2 es solo para la transferencia de datos, ya que no se admite la delegación de predicados.

En este ejemplo se muestra cómo crear la credencial de ámbito de base de datos para la autenticación en una cuenta de Azure Data Lake Storage Gen2. Especifique la clave de la cuenta de Azure Storage en el secreto de la credencial de base de datos. Puede especificar cualquier cadena en la identidad de la credencial con ámbito de base de datos, ya que no se usará para la autenticación en Azure Storage.

-- 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. Creación de un origen de datos externo mediante ODBC genérico en PostgreSQL

Como en ejemplos anteriores, primero cree una clave maestra de base de datos y una credencial con ámbito de base de datos. La credencial con ámbito de base de datos se usará para el origen de datos externo. En este ejemplo también se supone que hay un proveedor de datos ODBC genérico para PostgreSQL instalado en el servidor.

En este ejemplo, el proveedor de datos ODBC genérico se usa para conectarse a un servidor de base de datos de PostgreSQL en la misma red, donde el nombre de dominio completo del servidor de PostgreSQL es POSTGRES1, mediante el puerto predeterminado de TCP 5432.

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

Pasos siguientes

Información general (SQL Server 2022)

Se aplica a: SQL Server 2022 (16.x) y versiones posteriores

Crea un origen de datos externo para consultas de PolyBase. Los orígenes de datos externos se usan para establecer la conectividad y admiten estos casos de uso principales:

  • Virtualización y carga de datos mediante PolyBase
  • Operaciones de carga masiva con BULK INSERT o OPENROWSET

Nota

Esta sintaxis varía en las diferentes versiones de SQL Server. Use la lista desplegable del selector de versiones para elegir la versión adecuada. Este contenido se aplica a SQL Server 2022 (16.x) y versiones posteriores.

Sintaxis para SQL Server 2022 y versiones posteriores

Para más información sobre las convenciones de sintaxis, vea Convenciones de sintaxis de 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 } ]
  )
[ ; ]

Argumentos

data_source_name

Especifica el nombre definido por el usuario para el origen de datos. El nombre debe ser único en la base de datos en SQL Server.

LOCATION = '<prefix>://<path[:port]>'

Proporciona el protocolo de conectividad y la ruta de acceso al origen de datos externo.

Origen de datos externo Prefijo de ubicación del conector Ruta de acceso de ubicación Ubicaciones admitidas por producto o servicio Authentication
Cuenta de Azure Storage (V2) abs abs://<container_name>@<storage_account_name>.blob.core.windows.net/
o
abs://<storage_account_name>.blob.core.windows.net/<container_name>
A partir de SQL Server 2022 (16.x)
Se admite el espacio de nombres jerárquico.
Firma de acceso compartido (SAS)
Azure Data Lake Storage Gen2 adls adls://<container_name>@<storage_account_name>.dfs.core.windows.net/
o
adls://<storage_account_name>.dfs.core.windows.net/<container_name>
A partir de SQL Server 2022 (16.x) Firma de acceso compartido (SAS)
SQL Server sqlserver <server_name>[\<instance_name>][:port] A partir de SQL Server 2019 (15.x) Solo autenticación SQL
Oracle oracle <server_name>[:port] A partir de SQL Server 2019 (15.x) Solo autenticación básica
Teradata teradata <server_name>[:port] A partir de SQL Server 2019 (15.x) Solo autenticación básica
MongoDB o API de Cosmos DB para MongoDB mongodb <server_name>[:port] A partir de SQL Server 2019 (15.x) Solo autenticación básica
ODBC genérico odbc <server_name>[:port] A partir de SQL Server 2019 (15.x): solo Windows Solo autenticación básica
Operaciones masivas https <storage_account>.blob.core.windows.net/<container> A partir de SQL Server 2017 (14.x) Firma de acceso compartido (SAS)
Almacenamiento de objetos compatible con S3 s3 - Compatible con S3: s3://<server_name>:<port>/
- AWS S3: s3://<bucket_name>.S3.amazonaws.com[:port]/<folder>
o s3://s3.amazonaws.com[:port]/<bucket_name>/<folder>
A partir de SQL Server 2022 (16.x) Básico o de paso a través (STS) *

* Debe ser una credencial con ámbito de base de datos, donde identity está codificada de forma rígida y el argumento SECRET tiene el formato = '<AccessKeyID>:<SecretKeyID>' o usa la autorización de paso a IDENTITY = 'S3 Access Key' través (STS). Para obtener más información, vea Configuración de PolyBase para acceder a datos externos en el almacenamiento de objetos compatible con S3.

Ruta de acceso de ubicación:

  • port = el puerto en el cual escucha el origen de datos externo. Opcional en muchos casos, en función de la configuración de red.
  • <container_name> = el contenedor de la cuenta de almacenamiento que contiene los datos. Los contenedores raíz son de solo lectura, no se pueden volver a escribir datos en el contenedor.
  • <storage_account> = nombre de la cuenta de almacenamiento del recurso de Azure.
  • <server_name> = el nombre de host.
  • <instance_name> = el nombre de la instancia con nombre de SQL Server. Se usa si tiene el servicio de SQL Server Browser en ejecución en la instancia de destino.
  • <ip_address>:<port>= Solo para el almacenamiento de objetos compatible con S3 (a partir de SQL Server 2022 (16.x)), el punto de conexión y el puerto usados para conectarse al almacenamiento compatible con S3.
  • <bucket_name> = Solo para el almacenamiento de objetos compatible con S3 (a partir de SQL Server 2022 (16.x),específico de la plataforma de almacenamiento.
  • <region> = Solo para el almacenamiento de objetos compatible con S3 (a partir de SQL Server 2022 (16.x),específico de la plataforma de almacenamiento.
  • <folder> = Parte de la ruta de acceso de almacenamiento dentro de la dirección URL de almacenamiento.

Instrucciones y notas adicionales cuando se establece la ubicación:

  • El motor de base de datos de SQL Server no comprueba la existencia del origen de datos externo cuando se crea el objeto. Para la validación, crea una tabla externa utilizando el origen de datos externo.
  • Puede usar el conector sqlserver para conectar SQL Server 2019 (15.x) a otro SQL Server, a Azure SQL Database o a Azure Synapse Analytics.
  • Especifique Driver={<Name of Driver>} al conectarse a través de ODBC.
  • La opción Espacio de nombres jerárquico para cuentas de Azure Storage (V2) que usen el prefijo adls se admite a través de Azure Data Lake Storage Gen2 en SQL Server 2022 (16.x).
  • La compatibilidad de SQL Server con los orígenes de datos externos HDFS Cloudera (CDP) y Hortonworks (HDP) se retira y no se incluye en SQL Server 2022 (16.x). No es necesario usar el argumento TYPE en SQL Server 2022 (16.x).
  • Para obtener más información sobre el almacenamiento de objetos compatible con S3 y PolyBase a partir de SQL Server 2022 (16.x), vea Configuración de PolyBase para acceder a datos externos en el almacenamiento de objetos compatible con S3. Para obtener un ejemplo de consulta de un archivo parquet dentro del almacenamiento de objetos compatible con S3, consulte Virtualización del archivo parquet en un almacenamiento de objetos compatible con S3 con PolyBase.
  • A diferencia de las versiones anteriores, en SQL Server 2022 (16.x), el prefijo utilizado para la cuenta de Azure Storage (v2) ha cambiado de wasb[s] a abs.
  • A diferencia de las versiones anteriores, en SQL Server 2022 (16.x), el prefijo utilizado para Azure Data Lake Storage Gen2 ha cambiado de abfs[s] a adls.
  • Para obtener un ejemplo de uso de PolyBase para virtualizar un archivo CSV en Azure Storage, consulte Virtualización de un archivo CSV con PolyBase.
  • Para obtener un ejemplo de uso de PolyBase para virtualizar una tabla delta en ADLS Gen2, consulte Virtualización de una tabla delta con PolyBase.
  • SQL Server 2022 (16.x) admite totalmente dos formatos de dirección URL para la cuenta de Azure Storage v2 (abs) y Azure Data Lake Gen2 (adls).
    • La ruta LOCATION puede usar los formatos: <container>@<storage_account_name>.. (recomendado) o <storage_account_name>../<container>. Por ejemplo:
      • Cuenta de Azure Storage v2: abs://<container>@<storage_account_name>.blob.core.windows.net (recomendado) o abs://<storage_account_name>.blob.core.windows.net/<container>.
      • Azure Data Lake Gen2 admite: adls://<container>@<storage_account_name>.blob.core.windows.net (recomendado) o adls://<storage_account_name>.dfs.core.windows.net/<container>.

CONNECTION_OPTIONS = key_value_pair

Se especifica para SQL Server 2019 (15.x) y versiones posteriores. Especifica opciones adicionales al conectarse a través de ODBC a un origen de datos externo. Para usar varias opciones de conexión, sepárelas mediante punto y coma.

Se aplica a las conexiones ODBC genéricas, así como a los conectores ODBC integrados para SQL Server, Oracle, Teradata, MongoDB y la API de Azure Cosmos DB para MongoDB.

key_value_pair es la palabra clave y el valor de una opción de conexión específica. Las palabras clave y los valores disponibles dependen del tipo de origen de datos externo. Se requiere como mínimo el nombre del controlador, pero existen otras opciones, como APP='<your_application_name>' o ApplicationIntent= ReadOnly|ReadWrite, que también resulta útil establecerlas y pueden ayudarle con la solución de problemas.

Los posibles pares clave-valor son específicos del controlador. Para más información sobre cada proveedor, consulte CREATE EXTERNAL DATA SOURCE (Transact-SQL) CONNECTION_OPTIONS.

A partir de Se aplica a: actualización acumulativa 2 de SQL Server 2022 (16.x), se introdujeron palabras clave adicionales para admitir archivos TNS de Oracle:

  • La palabra clave TNSNamesFile especifica la ruta de acceso al archivo tnsnames.ora ubicado en el servidor de Oracle.
  • La palabra clave ServerName especifica el alias usado dentro del tnsnames.ora que se usará para reemplazar el nombre de host y el puerto.

PUSHDOWN = ON | OFF

Se aplica a: SQL Server 2019 (15.x) y versiones posteriores. Indica si se puede insertar cálculo en el origen de datos externo. El valor predeterminado es ON.

PUSHDOWN se admite al conectarse a SQL Server, Oracle, Teradata, MongoDB, la API Azure Cosmos DB para MongoDB u ODBC en el nivel de origen de datos externo.

Habilitar o deshabilitar la inserción en el nivel de consulta se logra a través de una sugerencia.

CREDENTIAL = credential_name

Especifica una credencial de ámbito de base de datos para la autenticación en el origen de datos externo.

Instrucciones y notas adicionales cuando se crea una credencial:

Hay varias maneras de crear una firma de acceso compartido:

  • Puede crear un token de SAS; para ello, vaya a Azure Portal ><Su_cuenta_de_almacenamiento> -> Firma de acceso compartido -> Configurar permisos -> Generar la cadena de conexión y SAS. Para más información, consulte Generación de una firma de acceso compartido.

  • Puede crear y configurar una SAS con Explorador de Azure Storage.

  • Puede crear una SAS mediante programación a través de PowerShell, la CLI de Azure, .NET y la API de REST. Para obtener más información, consulte Otorgar acceso limitado a recursos de Azure Storage con firmas de acceso compartido (SAS).

  • El token de SAS debe configurarse del modo siguiente:

    • Cuando se genera un token de SAS, este incluye un signo de interrogación ("?") al principio del token. Excluya el ? inicial cuando se configura como SECRET.
    • Usar un período de caducidad válido (todas las fechas se encuentran en hora UTC).
    • Conceder al menos permiso de lectura en el archivo que se debe cargar (por ejemplo, srt=o&sp=r). Se pueden crear varias firmas de acceso compartido para diferentes casos de uso. Los permisos se deben conceder de la siguiente manera:
    Acción Permiso
    Leer datos desde un archivo Lectura
    Leer datos de varios archivos y subcarpetas Lectura y enumeración
    Usar Create External Table as Select (CETAS) Lectura, Crear, Enumerar y Escritura
  • Para Azure Blob Storage y Azure Data Lake Gen 2:

    • Servicios permitidos: se debe seleccionar Blob para generar el token de SAS.
    • Tipos de recursos permitidos: se deben seleccionar Container y Object para generar el token de SAS.

Para obtener un ejemplo del uso de un elemento CREDENTIAL con el almacenamiento de objetos compatible con S3 y PolyBase, consulte Configuración de PolyBase para acceder a datos externos en el almacenamiento de objetos compatible con S3.

Para crear una credencial con ámbito de base de datos, vea CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL).

Permisos

Requiere el permiso CONTROL en la base de datos en SQL Server.

Bloqueo

Toma un bloqueo compartido en el objeto EXTERNAL DATA SOURCE.

Seguridad

PolyBase es compatible con la autenticación basada en proxy para la mayoría de orígenes de datos externos. Cree una credencial con ámbito de base de datos para crear la cuenta de proxy.

Actualizar a SQL Server 2022

A partir de SQL Server 2022 (16.x) ya no se admiten orígenes de datos externos de Hadoop. Es necesario volver a crear manualmente orígenes de datos externos creados anteriormente con TYPE = HADOOP y cualquier tabla externa que use este origen de datos externo.

Los usuarios también tendrán que configurar sus orígenes de datos externos para usar nuevos conectores al conectarse a Azure Storage.

Origen de datos externo De En
Azure Blob Storage wasb[s] abs
ADLS Gen2 abfs[s] adls

Ejemplos

Importante

Para obtener información sobre cómo instalar y habilitar PolyBase, vea Instalación de PolyBase en Windows

A. Creación de un origen de datos externo en SQL Server para hacer referencia a Oracle

Para crear un origen de datos externo que haga referencia a Oracle, asegúrese de que tiene una credencial con ámbito de base de datos. También, opcionalmente, puede habilitar o deshabilitar la inserción de cálculo en este origen de datos.

-- 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
);

Opcionalmente, el origen de datos externo a Oracle puede usar la autenticación de proxy para proporcionar un control de acceso más preciso. Un usuario de proxy se puede configurar para tener acceso limitado en comparación con el usuario que se va a suplantar.

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]
);

Como alternativa, puede autenticarse mediante TNS.

A partir de Se aplica a: la actualización acumulativa 2 CREATE EXTERNAL DATA SOURCE de SQL Server 2022 (16.x), ahora admite el uso de archivos TNS al conectarse a Oracle. El parámetro CONNECTION_OPTIONS se expandió y ahora usa TNSNamesFile y ServerName como variables para examinar el archivo tnsnames.ora y establecer la conexión con el servidor.

En el ejemplo siguiente, durante el tiempo de ejecución, SQL Server buscará la ubicación del archivo tnsnames.ora especificada por TNSNamesFile y buscará el host y el puerto de red especificados por 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. Creación de un origen de datos externo para hacer referencia a una instancia con nombre de SQL Server mediante la conectividad de PolyBase

Se aplica a: SQL Server 2019 (15.x) y versiones posteriores

Para crear un origen de datos externo que haga referencia a una instancia con nombre de SQL Server, use CONNECTION_OPTIONS para especificar el nombre de la instancia.

En primer lugar, cree la credencial con ámbito de base de datos y almacene las credenciales para un inicio de sesión autenticado de SQL. El conector ODBC de SQL para PolyBase solo admite la autenticación básica. Para poder crear una credencial con ámbito de base de datos, la base de datos debe tener una clave maestra para proteger la credencial. Para obtener más información, vea CREATE MASTER KEY. En el ejemplo siguiente se crea una credencial con ámbito de base de datos, y se le proporciona su propio inicio de sesión y contraseña.

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

En el ejemplo siguiente, WINSQL2019 es el nombre de host y SQL2019 el de la instancia. 'Server=%s\SQL2019' es el par de clave-valor.

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

Como alternativa, puede usar un puerto para conectarse a una instancia predeterminada de SQL Server.

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

C. Creación de un origen de datos externo para hacer referencia a una réplica secundaria legible de un grupo de disponibilidad Always On

Se aplica a: SQL Server 2019 (15.x) y versiones posteriores

Para crear un origen de datos externo que haga referencia a una réplica secundaria legible de SQL Server, use CONNECTION_OPTIONS para especificar el ApplicationIntent=ReadOnly. Además, deberá establecer la base de datos de disponibilidad como Database={dbname} en CONNECTION_OPTIONSo establecer la base de datos de disponibilidad como la base de datos de disponibilidad como la base de datos predeterminada del inicio de sesión usado para la credencial con ámbito de base de datos. Tendrá que hacerlo en todas las réplicas de disponibilidad del grupo de disponibilidad.

En primer lugar, cree la credencial con ámbito de base de datos y almacene las credenciales para un inicio de sesión autenticado de SQL. El conector ODBC de SQL para PolyBase solo admite la autenticación básica. Para poder crear una credencial con ámbito de base de datos, la base de datos debe tener una clave maestra para proteger la credencial. Para obtener más información, vea CREATE MASTER KEY. En el ejemplo siguiente se crea una credencial con ámbito de base de datos, y se le proporciona su propio inicio de sesión y contraseña.

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

A continuación, cree el nuevo origen de datos externo.

Tanto si incluyó Database=dbname en la CONNECTION_OPTIONS base de datos de disponibilidad como la base de datos predeterminada para el inicio de sesión en la credencial con ámbito de base de datos, debe proporcionar el nombre de la base de datos a través de un nombre de tres partes en la instrucción CREATE EXTERNAL TABLE, dentro del parámetro LOCATION. Para obtener un ejemplo, vea CREATE EXTERNAL TABLE.

En el ejemplo siguiente, WINSQL2019AGL es el nombre del agente de escucha del grupo de disponibilidad y dbname es el nombre de la base de datos que será el destino de la instrucción CREATE EXTERNAL TABLE.

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

Puede demostrar el comportamiento de redireccionamiento del grupo de disponibilidad especificando ApplicationIntent y creando una tabla externa en la vista del sistema sys.servers. En el siguiente script de ejemplo, se crean dos orígenes de datos externos y se crea una tabla externa para cada uno. Use las vistas para probar qué servidor responde a la conexión. Se pueden obtener resultados similares con la característica de enrutamiento de solo lectura. Para más información, consulte Configuración del enrutamiento de solo lectura para un grupo de disponibilidad 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

Dentro de la base de datos del grupo de disponibilidad, cree una vista para devolver sys.servers y el nombre de la instancia local, lo que le ayuda a identificar qué réplica responde a la consulta. Para obtener más información, consulte sys.servers.

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

A continuación, cree una tabla externa en la instancia de origen:

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. Creación de un origen de datos externo para consultar un archivo parquet en el almacenamiento de objetos compatible con S3 a través de PolyBase

Se aplica a: SQL Server 2022 (16.x) y versiones posteriores.

El siguiente script de ejemplo crea un origen de datos externo s3_ds en la base de datos de usuario de origen de SQL Server. El origen de datos externo hace referencia a la credencial de ámbito de base de datos 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

Compruebe el nuevo origen de datos externo con sys.external_data_sources.

SELECT * FROM sys.external_data_sources;

A continuación, en el ejemplo siguiente se muestra el uso de T-SQL para consultar un archivo parquet almacenado en el almacenamiento de objetos compatible con S3 mediante la consulta OPENROWSET. Para obtener más información, consulte Virtualización del archivo parquet en un almacenamiento de objetos compatible con S3 con PolyBase.

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

E. Creación de un origen de datos externo mediante ODBC genérico en PostgreSQL

Como en ejemplos anteriores, primero cree una clave maestra de base de datos y una credencial con ámbito de base de datos. La credencial con ámbito de base de datos se usará para el origen de datos externo. En este ejemplo también se supone que hay un proveedor de datos ODBC genérico para PostgreSQL instalado en el servidor.

En este ejemplo, el proveedor de datos ODBC genérico se usa para conectarse a un servidor de base de datos de PostgreSQL en la misma red, donde el nombre de dominio completo del servidor de PostgreSQL es POSTGRES1, mediante el puerto predeterminado de TCP 5432.

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

Azure Storage

Creación de una firma de acceso compartido

Tanto en Azure Blob Storage como en Azure Data Lake Gen2, el método de autenticación admitido es la firma de acceso compartido (SAS). Una manera sencilla de generar un token de firma de acceso compartido es mediante los pasos que se describen a continuación. Para más información, consulte CREDENTIAL.

  1. Vaya a Azure Portal y elija la cuenta de almacenamiento deseada.
  2. Vaya al contenedor deseado en el menú Almacenamiento de datos.
  3. Seleccione Tokens de acceso compartido.
  4. Elija el permiso adecuado en función de la acción deseada. Como referencia, use la tabla siguiente:
Acción Permiso
Leer datos desde un archivo Lectura
Leer datos de varios archivos y subcarpetas Lectura y enumeración
Usar Create External Table as Select (CETAS) Lectura, creación y escritura
  1. Elegir la fecha de vencimiento del token.
  2. Generar URL y token de SAS.
  3. Copiar el token de SAS.

F. Creación de un origen de datos externo para acceder a los datos de Azure Blob Storage mediante la interfaz abs://

Se aplica a: SQL Server 2022 (16.x) y versiones posteriores

A partir de SQL Server 2022 (16.x), use un nuevo prefijo abs para la cuenta de Azure Storage v2. El prefijo abs admite la autenticación con SHARED ACCESS SIGNATURE. El prefijo abs reemplaza al wasb, usado en versiones anteriores. Dado que HADOOP ya no se admite, no es necesario usar TYPE = BLOB_STORAGE.

La clave de la cuenta de almacenamiento de Azure ya no es necesaria, alternativamente se usa un token de SAS, como se puede ver en el ejemplo siguiente:

-- 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,
);

Para ver un ejemplo más detallado sobre cómo acceder a los archivos CSV almacenados en Azure Blob Storage, consulte Virtualizar archivo CSV con PolyBase.

G. Creación de un origen de datos externo para acceder a los datos en Azure Data Lake Gen2

Se aplica a: SQL Server 2022 (16.x) y versiones posteriores.

A partir de SQL Server 2022 (16.x), utilice un nuevo prefijo adls para Azure Data Lake Gen2, en sustitución del abfs utilizado en versiones anteriores. El prefijo adls también admite el token de SAS como método de autenticación, como se muestra en este ejemplo:

--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
);

Para ver un ejemplo más detallado sobre cómo acceder a los archivos delta almacenados en Azure Data Lake Gen2, consulte Virtualizar tabla delta con PolyBase.

Ejemplos: Operaciones masivas

Importante

No coloque un / final, nombre de archivo o parámetros de firma de acceso compartido al final de la dirección URL de LOCATION al configurar un origen de datos externo para las operaciones masivas.

H. Creación de un origen de datos externo para operaciones masivas de recuperación de datos desde Azure Storage

Se aplica a: SQL Server 2022 (16.x) y versiones posteriores.

Use el origen de datos siguiente para las operaciones masivas con BULK INSERT o OPENROWSET. La credencial debe establecer SHARED ACCESS SIGNATURE como identidad, no debe tener al inicio ? en el token de SAS, debe tener al menos permiso de lectura en el archivo que se debe cargar (por ejemplo srt=o&sp=r), y el período de expiración debe ser válido (todas las fechas se expresan en hora UTC). Para más información sobre las firmas de acceso compartido, vea Uso de Firmas de acceso compartido (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,
);

Pasos siguientes

* SQL Database *  

 

Introducción: Azure SQL Database

Se aplica a: Azure SQL Database

Crea un origen de datos externo para consultas elásticas. Los orígenes de datos externos se usan para establecer la conectividad y admiten estos casos de uso principales:

  • Operaciones de carga masiva con BULK INSERT o OPENROWSET
  • Consultar instancias remotas de SQL Database o Azure Synapse utilizando SQL Database con consulta elástica
  • Consultar una instancia de SQL Database con particiones mediante la consulta elástica

Syntax

Para más información sobre las convenciones de sintaxis, vea Convenciones de sintaxis de Transact-SQL.

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

Argumentos

data_source_name

Especifica el nombre definido por el usuario para el origen de datos. El nombre debe ser único en la base de datos en SQL Database.

LOCATION = '<prefix>://<path[:port]>'

Proporciona el protocolo de conectividad y la ruta de acceso al origen de datos externo.

Origen de datos externo Prefijo de ubicación del conector Ruta de acceso de ubicación Disponibilidad
Operaciones masivas https <storage_account>.blob.core.windows.net/<container>
Consulta elástica (partición) No se requiere <shard_map_server_name>.database.windows.net
Consulta elástica (remota) No se requiere <remote_server_name>.database.windows.net
EdgeHub edgehub edgehub:// Solo está disponible en Azure SQL Edge. EdgeHub siempre es local para la instancia de Azure SQL Edge. Como tal, no es necesario especificar una ruta de acceso o un valor de puerto.
Kafka kafka kafka://<kafka_bootstrap_server_name_ip>:<port_number> Solo está disponible en Azure SQL Edge.

Ruta de acceso de ubicación:

  • <shard_map_server_name> = el nombre del servidor lógico de Azure que hospeda el administrador del mapa de particiones. El argumento DATABASE_NAME proporciona la base de datos que se utiliza para hospedar el mapa de particiones y SHARD_MAP_NAME se utiliza para el propio mapa de particiones.
  • <remote_server_name> = el nombre de servidor lógico de destino para la consulta elástica. El nombre de la base de datos se especifica utilizando el argumento DATABASE_NAME.

Instrucciones y notas adicionales cuando se establece la ubicación:

  • El motor de base de datos no comprueba la existencia del origen de datos externo cuando se crea el objeto. Para la validación, crea una tabla externa utilizando el origen de datos externo.

CREDENTIAL = credential_name

Especifica una credencial de ámbito de base de datos para la autenticación en el origen de datos externo.

Instrucciones y notas adicionales cuando se crea una credencial:

  • Para cargar datos de Azure Storage en Azure SQL Database, use una firma de acceso compartido (token de SAS).
  • CREDENTIAL solo se necesita si se han protegido los datos. CREDENTIAL no es necesario para los conjuntos de datos que permiten el acceso anónimo.
  • Cuando TYPE = BLOB_STORAGE, la credencial debe crearse mediante el uso de SHARED ACCESS SIGNATURE como identidad.
  • Al conectarse a la instancia de Azure Storage mediante el conector WASB[s], la autenticación debe realizarse con una clave de cuenta de almacenamiento, no con una firma de acceso compartido (SAS).
  • Cuando TYPE = HADOOP, la credencial debe crearse con la clave de la cuenta de almacenamiento como SECRET.
  • TYPE = BLOB_STORAGE solo se permite para operaciones masivas; no se pueden crear tablas externas para un origen de datos externo con TYPE = BLOB_STORAGE.

Hay varias maneras de crear una firma de acceso compartido:

  • Puede crear un token de SAS; para ello, vaya a Azure Portal ><Su_cuenta_de_almacenamiento> -> Firma de acceso compartido -> Configurar permisos -> Generar la cadena de conexión y SAS. Para más información, consulte Generación de una firma de acceso compartido.

  • Puede crear y configurar una SAS con Explorador de Azure Storage.

  • Puede crear una SAS mediante programación a través de PowerShell, la CLI de Azure, .NET y la API de REST. Para obtener más información, consulte Otorgar acceso limitado a recursos de Azure Storage con firmas de acceso compartido (SAS).

  • El token de SAS debe configurarse del modo siguiente:

    • Cuando se genera un token de SAS, este incluye un signo de interrogación ("?") al principio del token. Excluya el ? inicial cuando se configura como SECRET.
    • Usar un período de caducidad válido (todas las fechas se encuentran en hora UTC).
    • Conceder al menos permiso de lectura en el archivo que se debe cargar (por ejemplo, srt=o&sp=r). Se pueden crear varias firmas de acceso compartido para diferentes casos de uso. Los permisos se deben conceder de la siguiente manera:
    Acción Permiso
    Leer datos desde un archivo Lectura
    Leer datos de varios archivos y subcarpetas Lectura y enumeración
    Usar Create External Table as Select (CETAS) Lectura, creación y escritura

Para obtener un ejemplo del uso de CREDENTIAL con SHARED ACCESS SIGNATURE y TYPE = BLOB_STORAGE, vea Creación de un origen de datos externo para ejecutar operaciones masivas y recuperar datos desde Azure Storage en SQL Database.

Para crear una credencial con ámbito de base de datos, vea CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL).

TYPE = [ BLOB_STORAGE | RDBMS | SHARD_MAP_MANAGER]

Especifica el tipo de origen de datos externo que se está configurando. Este parámetro no siempre es necesario.

  • Use RDBMS para consultas entre bases de datos mediante una consulta elástica de SQL Database.
  • Use SHARD_MAP_MANAGER al crear un origen de datos externo al conectarse a una base de datos SQL Database particionada.
  • Use BLOB_STORAGE al ejecutar operaciones masivas con BULK INSERT u OPENROWSET.

Importante

No establezca TYPE si usa cualquier otro origen de datos externo.

DATABASE_NAME = database_name

Configure este argumento cuando TYPE se haya establecido en RDBMS o SHARD_MAP_MANAGER.

TYPE Valor de DATABASE_NAME
RDBMS El nombre de la base de datos remota en el servidor que se proporciona mediante LOCATION
SHARD_MAP_MANAGER Nombre de la base de datos que funciona como administrador del mapa de particiones

Para obtener un ejemplo en el que se muestra cómo crear un origen de datos externo donde TYPE = RDBMS vea Creación de un origen de datos externo de RDBMS.

SHARD_MAP_NAME = shard_map_name

Se usa cuando el TYPE argumento está establecido en SHARD_MAP_MANAGER únicamente para establecer el nombre del mapa de particiones.

Para obtener un ejemplo en el que se muestra cómo crear un origen de datos externo donde TYPE = SHARD_MAP_MANAGER vea Creación de un origen de datos externo de administrador de mapas de partición.

Permisos

Requiere el permiso CONTROL en la base de datos en Azure SQL Database.

Bloqueo

Toma un bloqueo compartido en el objeto EXTERNAL DATA SOURCE.

Ejemplos

A. Creación de un origen de datos externo de administrador de mapa de particiones

Si quiere crear un origen de datos externo para hacer referencia a SHARD_MAP_MANAGER, especifique el nombre del servidor de SQL Database que hospeda el administrador de mapa de particiones en SQL Database o una base de datos de SQL Server en una máquina virtual.

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'
);

Para obtener un tutorial paso a paso, vea Getting started with elastic queries for sharding (horizontal partitioning) [Introducción a las consultas elásticas para particionamiento (creación de particiones horizontales)].

B. Creación de un origen de datos externo de RDBMS

Para crear un origen de datos externo para hacer referencia a RDBMS, especifique el nombre del servidor de SQL Database de la base de datos remota en SQL Database.

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
);

Para obtener un tutorial paso a paso sobre RDBMS, vea Introducción a las consultas entre bases de datos (particiones verticales).

Ejemplos: operaciones masivas

Importante

No coloque un / final, nombre de archivo o parámetros de firma de acceso compartido al final de la dirección URL de LOCATION al configurar un origen de datos externo para las operaciones masivas.

C. Creación de un origen de datos externo para operaciones masivas de recuperación de datos desde Azure Storage

Use el origen de datos siguiente para las operaciones masivas con BULK INSERT o OPENROWSET. La credencial debe establecer SHARED ACCESS SIGNATURE como identidad, no debe tener al inicio ? en el token de SAS, debe tener al menos permiso de lectura en el archivo que se debe cargar (por ejemplo srt=o&sp=r), y el período de expiración debe ser válido (todas las fechas se expresan en hora UTC). Para más información sobre las firmas de acceso compartido, vea Uso de Firmas de acceso compartido (SAS).

CREATE DATABASE SCOPED CREDENTIAL AccessAzureInvoices
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
    -- Remove ? from the beginning of the SAS token
    SECRET = '******srt=sco&sp=rwac&se=2017-02-01T00:55:34Z&st=2016-12-29T16:55:34Z***************';

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

Para ver este ejemplo en uso, vea BULK INSERT.

Ejemplos: Azure SQL Edge

Importante

Para obtener información sobre cómo configurar datos externos para Azure SQL Edge, vea Streaming de datos en Azure SQL Edge.

A. Creación de un origen de datos externo para hacer referencia a Kafka

Se aplica a: Azure SQL Edge solo

En este ejemplo, el origen de datos externo es un servidor Kafka que tiene la dirección IP xxx.xxx.xxx.xxx y que escucha en el puerto 1900. El origen de datos externo Kafka es solo para el streaming de datos y no admite la delegación de predicados.

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

B. Creación de un origen de datos externo para hacer referencia a EdgeHub

Se aplica a: Azure SQL Edge solo

En este ejemplo, el origen de datos externo es EdgeHub, que se ejecuta en el mismo dispositivo perimetral que Azure SQL Edge. El origen de datos externo edgeHub es solo para el streaming de datos y no admite la inserción de predicados.

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

Pasos siguientes

* Azure Synapse
Analytics *
 

 

Introducción: Azure Synapse Analytics

Se aplica a: Azure Synapse Analytics

Crea un origen de datos externo para la virtualización de datos. Los orígenes de datos externos se usan para establecer la conectividad y admiten el caso de uso principal de virtualización y carga de datos desde orígenes de datos externos. Para más información, vea Uso de tablas externas con Synapse SQL.

Importante

Para crear un origen de datos de externo y consultar una instancia de Azure Synapse Analytics mediante Azure SQL Database con consulta elástica, vea SQL Database.

Syntax

Para más información sobre las convenciones de sintaxis, vea Convenciones de sintaxis de Transact-SQL.

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

Argumentos

data_source_name

Especifica el nombre definido por el usuario para el origen de datos. El nombre debe ser único en Azure SQL Database en Azure Synapse Analytics.

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

Proporciona el protocolo de conectividad y la ruta de acceso al origen de datos externo.

Origen de datos externo Prefijo de ubicación del conector Ruta de acceso de ubicación
Data Lake Storage* Gen1 adl <storage_account>.azuredatalake.net
Data Lake Storage Gen2 abfs[s] <container>@<storage_account>.dfs.core.windows.net
Azure Blob Storage wasbs <container>@<storage_account>.blob.core.windows.net
Azure Blob Storage 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 tiene compatibilidad limitada, por lo que se recomienda Gen2 para todo el desarrollo nuevo.

Origen de datos externo Prefijo de ubicación del conector Grupos de SQL dedicados: PolyBase Grupos de SQL dedicados: nativos* Grupos de SQL sin servidor
Data Lake Storage** Gen1 adl No No
Data Lake Storage Gen2 abfs[s]
Azure Blob Storage wasbs Sí***
Almacenamiento de blobs de Azure https No
Data Lake Storage Gen1 http[s] No No
Data Lake Storage Gen2 http[s]
Data Lake Storage Gen2 wasb[s]

* Los grupos de SQL sin servidor y dedicados de Azure Synapse Analytics usan diferentes bases de código para la virtualización de datos. Los grupos de SQL sin servidor admiten una tecnología nativa de virtualización de datos. Los grupos de SQL dedicados admiten la virtualización de datos nativa y de PolyBase. La virtualización de datos de PolyBase se usa cuando se crea el ORIGEN DE DATOS EXTERNO con TYPE=HADOOP.

** Microsoft Azure Data Lake Storage Gen1 tiene compatibilidad limitada, por lo que se recomienda Gen2 para todo el desarrollo nuevo.

*** Se recomienda el conector más seguro wasbs en lugar de wasb. Solo la virtualización de datos nativa en los grupos de SQL dedicados (donde TYPE no es igual a HADOOP) admite wasb.

Ruta de acceso de ubicación:

  • <container> = el contenedor de la cuenta de almacenamiento que contiene los datos. Los contenedores raíz son de solo lectura, no se pueden volver a escribir datos en el contenedor.
  • <storage_account> = el nombre de la cuenta de almacenamiento del recurso de Azure.

Instrucciones y notas adicionales cuando se establece la ubicación:

  • La opción predeterminada consiste en usar enable secure SSL connections al aprovisionar Azure Data Lake Storage Gen2. Si está habilitada, debe usar abfss al seleccionar una conexión TLS/SSL segura. Tenga en cuenta que abfss funciona también con conexiones TLS no seguras. Para obtener más información, vea Controlador Azure Blob File System (ABFS).
  • Azure Synapse no comprueba la existencia del origen de datos externo cuando se crea el objeto. Para la validación, crea una tabla externa utilizando el origen de datos externo.
  • Para garantizar una semántica de consulta coherente, use el mismo origen de datos externo para todas las tablas cuando realice consultas a Hadoop.
  • El prefijo https: le permite usar la subcarpeta en la ruta de acceso. https no está disponible para todos los métodos de acceso a datos.
  • wasbs se recomienda, ya que se enviarán los datos mediante una conexión TLS segura.
  • Los espacios de nombres jerárquicos no se admiten con las cuentas de almacenamiento de Azure V2 al acceder a los datos mediante la interfaz heredada wasb://, pero el uso de wasbs:// admite espacios de nombres jerárquicos.

CREDENTIAL = credential_name

Opcional. Especifica una credencial con ámbito de base de datos para autenticarse en el origen de datos externo. El origen de datos externo sin credenciales puede acceder a la cuenta de almacenamiento pública o usar la identidad de Microsoft Entra del autor de la llamada para acceder a los archivos en Azure Storage.

Instrucciones y notas adicionales cuando se crea una credencial:

  • Para cargar datos de Azure Storage o Azure Data Lake Store (ADLS) Gen2 en Azure Synapse Analytics, use una clave de Azure Storage.
  • CREDENTIAL solo se necesita si se han protegido los datos. CREDENTIAL no es necesario para los conjuntos de datos que permiten el acceso anónimo.

Para crear una credencial con ámbito de base de datos, vea CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL).

  • En el grupo de SQL sin servidor, las credenciales con ámbito de base de datos pueden especificar la identidad administrada del área de trabajo, el nombre de la entidad de seguridad de servicio o el token de firma de acceso compartido (SAS). El acceso a través de una identidad de usuario, también conocido como paso directo de Microsoft Entra, también es posible en la credencial con ámbito de base de datos, ya que es acceso anónimo al almacenamiento disponible públicamente. Para más información, consulte Tipos de autorización de almacenamiento admitidos.

  • En el grupo de SQL dedicado, las credenciales con ámbito de base de datos pueden especificar el token de firma de acceso compartido (SAS), la clave de acceso de almacenamiento, la entidad de servicio, la identidad administrada del área de trabajo o el acceso directo de Microsoft Entra.

TYPE = HADOOP

Opcional; no se recomienda.

Solo puede especificar TYPE con grupos de SQL dedicados. HADOOP es el único valor permitido cuando se especifica. Los orígenes de datos externos con TYPE=HADOOP solo están disponibles en los grupos de SQL dedicados.

Use HADOOP para implementaciones heredadas; de lo contrario, se recomienda usar el acceso a datos nativos más recientes. No especifique el argumento de TIPO para usar el acceso a datos nativos más recientes.

A fin de obtener un ejemplo de cómo usar TYPE = HADOOP para cargar datos desde Azure Storage, vea Creación de un origen de datos externo para hacer referencia a Azure Data Lake Store Gen1 o 2 mediante una entidad de servicio.

Los grupos de SQL sin servidor y dedicados de Azure Synapse Analytics usan diferentes bases de código para la virtualización de datos. Los grupos de SQL sin servidor admiten una tecnología nativa de virtualización de datos. Los grupos de SQL dedicados admiten la virtualización de datos nativa y de PolyBase. La virtualización de datos de PolyBase se usa cuando se crea el ORIGEN DE DATOS EXTERNO con TYPE=HADOOP.

Permisos

Debe tener el permiso CONTROL para la base de datos.

Bloqueo

Toma un bloqueo compartido en el objeto EXTERNAL DATA SOURCE.

Seguridad

La mayoría de los orígenes de datos externos admiten la autenticación basada en proxy, mediante una credencial con ámbito de base de datos para crear la cuenta de proxy.

Se pueden usar claves de Firma de acceso compartido (SAS) para autenticarse en cuentas de almacenamiento de Azure Data Lake Store Gen 2. Los clientes que quieran autenticarse con una Firma de acceso compartido deben crear una credencial con ámbito de base de datos donde IDENTITY = "Shared Access Signature" y especificar un token SAS como secreto.

Si crea una credencial con ámbito de base de datos donde IDENTITY = "Shared Access Signature" y usa un valor de clave de almacenamiento como secreto, recibirá el siguiente mensaje de error:

'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]'

Ejemplos

A. Creación de un origen de datos externo para acceder a los datos de Azure Storage mediante la interfaz wasb://

En este ejemplo, el origen de datos externo es una cuenta de Azure Storage (V2) denominada logs. El contenedor de almacenamiento se denomina daily. El origen de datos externo de Azure Storage es solo para la transferencia de datos. No admite la inserción de predicado. No se admiten espacios de nombres jerárquicos al acceder a los datos mediante la interfaz de wasb://. Tenga en cuenta que al conectarse a la instancia de Azure Storage mediante el conector WASB,la autenticación debe realizarse con una clave de cuenta de almacenamiento, no con una firma de acceso compartido (SAS).

En este ejemplo se usa el método de acceso basado en Java de HADOOP heredado. En el ejemplo siguiente se muestra cómo crear la credencial de ámbito de base de datos para la autenticación en Azure Storage. Especifique la clave de la cuenta de Azure Storage en el secreto de la credencial de base de datos. Puede especificar cualquier cadena en la identidad de la credencial con ámbito de base de datos, ya que no se usará para la autenticación en Azure Storage.

-- 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. Creación de un origen de datos externo para hacer referencia a Azure Data Lake Store Gen 1 o 2 mediante una entidad de servicio

La conectividad de Azure Data Lake Store se puede basar en el URI de ADLS y en la entidad de servicio de la aplicación Microsoft Entra. La documentación para crear esta aplicación se puede encontrar en Autenticación de Data Lake Store mediante el identificador de Microsoft Entra.

-- 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. Creación de un origen de datos externo para hacer referencia a Azure Data Lake Store Gen2 con la clave de cuenta de almacenamiento

-- 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. Creación de un origen de datos externo para Azure Data Lake Store Gen2 mediante abfs://

No es necesario especificar SECRET al conectarse a la cuenta de Azure Data Lake Store Gen2 con el mecanismo de identidad administrada.

-- 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
);

Pasos siguientes

* Analytics
Platform System (PDW) *
 

 

Introducción: Sistema de la plataforma de análisis

Se aplica a: Analytics Platform System (PDW)

Crea un origen de datos externo para consultas de PolyBase. Los orígenes de datos externos se usan para establecer la conectividad y admiten el siguiente caso de uso: Virtualización y carga de datos mediante PolyBase.

Syntax

Para más información sobre las convenciones de sintaxis, vea Convenciones de sintaxis de Transact-SQL.

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

Argumentos

data_source_name

Especifica el nombre definido por el usuario para el origen de datos. El nombre debe ser único dentro del servidor en Analytics Platform System (PDW).

LOCATION = '<prefix>://<path[:port]>'

Proporciona el protocolo de conectividad y la ruta de acceso al origen de datos externo.

Origen de datos externo Prefijo de ubicación del conector Ruta de acceso de ubicación
Cloudera CDH o Hortonworks HDP hdfs <Namenode>[:port]
Cuenta de Azure Storage wasb[s] <container>@<storage_account>.blob.core.windows.net

Ruta de acceso de ubicación:

  • <Namenode>: nombre de equipo, nombre de URI de servicio o dirección IP de Namenode en el clúster de Hadoop. PolyBase debe resolver los nombres DNS utilizados por el clúster de Hadoop.
  • port = el puerto en el cual escucha el origen de datos externo. En Hadoop, el puerto se puede encontrar mediante el parámetro de configuración fs.defaultFS. El valor predeterminado es 8020.
  • <container> = el contenedor de la cuenta de almacenamiento que contiene los datos. Los contenedores raíz son de solo lectura, no se pueden volver a escribir datos en el contenedor.
  • <storage_account> = el nombre de la cuenta de almacenamiento del recurso de Azure.

Instrucciones y notas adicionales cuando se establece la ubicación:

  • El motor de PDW no comprueba la existencia del origen de datos externo cuando se crea el objeto. Para la validación, crea una tabla externa utilizando el origen de datos externo.
  • Para garantizar una semántica de consulta coherente, use el mismo origen de datos externo para todas las tablas cuando realice consultas a Hadoop.
  • wasbs se recomienda, ya que se enviarán los datos mediante una conexión TLS segura.
  • Los espacios de nombres jerárquicos no se admiten cuando se usan con cuentas de Azure Storage a través de wasb://.
  • Para garantizar que las consultas de PolyBase son correctas durante una conmutación por error del Namenode de Hadoop, considere la posibilidad de usar una dirección IP virtual para el Namenode del clúster de Hadoop. Si no, ejecute un comando ALTER EXTERNAL DATA SOURCE para que apunte a la nueva ubicación.

CREDENTIAL = credential_name

Especifica una credencial de ámbito de base de datos para la autenticación en el origen de datos externo.

Instrucciones y notas adicionales cuando se crea una credencial:

  • Para cargar datos de Azure Storage a Azure Synapse o PDW, use una clave de Azure Storage.
  • CREDENTIAL solo se necesita si se han protegido los datos. CREDENTIAL no es necesario para los conjuntos de datos que permiten el acceso anónimo.

TYPE = [ HADOOP ]

Especifica el tipo de origen de datos externo que se está configurando. Este parámetro no siempre es necesario.

  • Use HADOOP cuando el origen de datos externo sea Cloudera CDH, Hortonworks HDP o Azure Storage.

A fin de obtener un ejemplo de cómo usar TYPE = HADOOP para cargar datos desde Azure Storage, vea Creación de un origen de datos externo para hacer referencia a Hadoop.

RESOURCE_MANAGER_LOCATION = 'ResourceManager_URI[:port]'

En SQL Server 2019 (15.x), no especifique RESOURCE_MANAGER_LOCATION a menos que se conecte a Cloudera CDH, Hortonworks HDP o una cuenta de Azure Storage.

Configure este valor opcional solo al conectarse a Cloudera CDH, Hortonworks HDP o una cuenta de Azure Storage. Para obtener una lista completa de las versiones de Hadoop compatibles, vea Configuración de conectividad de PolyBase (Transact-SQL).

Cuando RESOURCE_MANAGER_LOCATION está definido, el optimizador de consultas tomará una decisión basada en el costo para mejorar el rendimiento. Se puede usar un trabajo de MapReduce para insertar el cálculo en Hadoop. La especificación de RESOURCE_MANAGER_LOCATION puede reducir significativamente el volumen de datos transferidos entre Hadoop y SQL, lo cual puede suponer una mejora en el rendimiento de las consultas.

Si no se especifica el administrador de recursos, se deshabilita la inserción de cálculo en Hadoop para las consultas de PolyBase. En Creación de un origen de datos externo para hacer referencia a Hadoop con la inserción habilitada se proporciona un ejemplo concreto y más instrucciones.

El valor RESOURCE_MANAGER_LOCATION no se valida cuando se crea el origen de datos externo. Escribir un valor incorrecto puede provocar un error de consulta en tiempo de ejecución cada vez que se intente la inserción, ya que el valor proporcionado no podrá realizar la resolución.

Para que PolyBase funcione correctamente con un origen de datos externo de Hadoop, los puertos de los siguientes componentes del clúster de Hadoop deben estar abiertos:

  • Puertos HDFS
    • NameNode
    • DataNode
  • Administrador de recursos
    • Envío de trabajo
    • Historial de trabajos

Si no se especifica el puerto, el valor predeterminado se elige mediante el valor actual de la configuración "hadoop connectivity".

Conectividad de Hadoop Puerto predeterminado del administrador de recursos
1 50300
2 50300
3 8021
4 8032
5 8050
6 8032
7 8050

En la tabla siguiente se muestran los puertos predeterminados para estos componentes. Tenga en cuenta que hay dependencias de la versión de Hadoop, así como la posibilidad de una configuración personalizada que no use la asignación de puerto predeterminada.

Componente de clúster de Hadoop Puerto predeterminado
NameNode 8020
DataNode (transferencia de datos, puerto IPC sin privilegios) 50010
DataNode (transferencia de datos, puerto IPC con privilegios) 1019
Envío de trabajos de Resource Manager (Hortonworks 1.3) 50300
Envío de trabajos de Resource Manager (Cloudera 4.3) 8021
Envío de trabajos de Resource Manager (Hortonworks 2.0 en Windows, Cloudera 5.x en Linux) 8032
Envío de trabajos de Resource Manager (Hortonworks 2.x, 3.0 en Linux, Hortonworks 2.1-3 en Windows) 8050
Historial de trabajos de Resource Manager 10020

Permisos

Requiere el permiso CONTROL en la base de datos en Analytics Platform System (PDW).

Nota

En versiones anteriores de PDW, para crear el origen de datos externo se necesitaban permisos ALTER ANY EXTERNAL DATA SOURCE.

Bloqueo

Toma un bloqueo compartido en el objeto EXTERNAL DATA SOURCE.

Seguridad

PolyBase es compatible con la autenticación basada en proxy para la mayoría de orígenes de datos externos. Cree una credencial con ámbito de base de datos para crear la cuenta de proxy.

No se admite un token de SAS con el tipo HADOOP. Solo se admite con el tipo = BLOB_STORAGE cuando se usa en su lugar una clave de acceso de la cuenta de almacenamiento. Si se intenta crear un origen de datos externo con el tipo HADOOP y una credencial SAS, aparece un error como el siguiente:

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 are not valid.: Error [Parameters provided to connect to the Azure storage account are not valid.] occurred while accessing external file.'

Ejemplos

A. Creación de un origen de datos externo para hacer referencia a Hadoop

Si quiere crear un origen de datos externo para hacer referencia a Hortonworks HDP o Cloudera CDH, especifique el nombre de equipo o la dirección IP de Namenode y puerto de Hadoop.

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

B. Creación de un origen de datos externo para hacer referencia a Hadoop con la inserción habilitada

Especifique la opción RESOURCE_MANAGER_LOCATION para habilitar la inserción de cálculo en Hadoop para las consultas de PolyBase. Una vez habilitado, PolyBase toma una decisión basada en el coste para determinar si se debe aplicar el cálculo de la consulta en 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. Creación de un origen de datos externo para hacer referencia a Hadoop con protección de Kerberos

Para comprobar si el clúster de Hadoop está protegido con Kerberos, compruebe el valor de la propiedad hadoop.security.authentication en core-site.xml de Hadoop. Para hacer referencia a un clúster de Hadoop protegido con Kerberos, debe especificar una credencial con ámbito de base de datos que contenga el nombre de usuario y la contraseña de Kerberos. La clave maestra de base de datos se usa para cifrar el secreto de la credencial de ámbito de base de datos.

-- 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. Creación de un origen de datos externo para acceder a los datos de Azure Storage mediante la interfaz wasb://

En este ejemplo, el origen de datos externo es una cuenta de Azure Storage (V2) denominada logs. El contenedor de almacenamiento se denomina daily. El origen de datos externo de Azure Storage es solo para la transferencia de datos. No admite la inserción de predicado. No se admiten espacios de nombres jerárquicos al acceder a los datos mediante la interfaz de wasb://. Tenga en cuenta que al conectarse a la instancia de Azure Storage mediante el conector WASB,la autenticación debe realizarse con una clave de cuenta de almacenamiento, no con una firma de acceso compartido (SAS).

En este ejemplo se muestra cómo crear la credencial de ámbito de base de datos para la autenticación en Azure Storage. Especifique la clave de la cuenta de Azure Storage en el secreto de la credencial de base de datos. Puede especificar cualquier cadena en la identidad de la credencial con ámbito de base de datos, ya que no se usará para la autenticación en Azure Storage.

-- 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
);

Pasos siguientes

* SQL Managed Instance *  

Introducción: Instancia administrada de Azure SQL

Se aplica a: Azure SQL Instancia administrada

Crea un origen de datos externo en Azure SQL Managed Instance. Para obtener información completa, consulte Virtualización de datos con Azure SQL Managed Instance.

La virtualización de datos de Azure SQL Managed Instance proporciona acceso a datos externos en diversos formatos de archivo a través de la sintaxis T-SQL OPENROWSET o la sintaxis T-SQL CREATE EXTERNAL TABLE.

Syntax

Para más información sobre las convenciones de sintaxis, vea Convenciones de sintaxis de Transact-SQL.

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

Argumentos

data_source_name

Especifica el nombre definido por el usuario para el origen de datos. El nombre debe ser único en la base de datos.

LOCATION = '<prefix>://<path[:port]>'

Proporciona el protocolo de conectividad y la ruta de acceso al origen de datos externo.

Origen de datos externo Prefijo de ubicación Ruta de acceso de ubicación
Azure Blob Storage 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>

El motor de base de datos no comprueba la existencia del origen de datos externo cuando se crea el objeto. Para la validación, crea una tabla externa utilizando el origen de datos externo.

No coloque un / final, nombre de archivo o parámetros de firma de acceso compartido al final de la dirección URL de LOCATION al configurar un origen de datos externo para las operaciones masivas.

CREDENTIAL = credential_name

Especifica una credencial de ámbito de base de datos para la autenticación en el origen de datos externo.

Instrucciones y notas adicionales cuando se crea una credencial:

  • Para cargar datos de Azure Storage en Azure SQL Managed Instance, use una firma de acceso compartido (token de SAS).
  • CREDENTIAL solo se necesita si se han protegido los datos. CREDENTIAL no es necesario para los conjuntos de datos que permiten el acceso anónimo.
  • Si se requiere una credencial, esta se debe crear mediante Managed Identity o SHARED ACCESS SIGNATURE como IDENTITY. Para crear una credencial con ámbito de base de datos, vea CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL).

Para usar la identidad de servicio administrada para la credencial con ámbito de base de datos:

  • Especifique WITH IDENTITY = 'Managed Identity'.

    • Use la identidad de servicio administrada asignada por el sistema de Azure SQL Managed Instance, que debe habilitarse si se va a usar con este fin.
  • Conceda el rol RBAC de Azure Lector para la identidad de servicio administrada asignada por el sistema de Azure SQL Managed Instance a los contenedores de Azure Blob Storage necesarios. Por ejemplo, mediante Azure Portal; consulte Asignación de roles de Azure mediante Azure Portal.

Para crear una firma de acceso compartido (SAS) para la credencial con ámbito de base de datos:

  • Especifique WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = ....

  • Hay varias maneras de crear una firma de acceso compartido:

  • El token de SAS debe configurarse del modo siguiente:

    • Cuando se genera un token de SAS, este incluye un signo de interrogación ("?") al principio del token. Excluya el ? inicial cuando se configura como SECRET.
    • Usar un período de caducidad válido (todas las fechas se encuentran en hora UTC).
    • Conceder al menos permiso de lectura en el archivo que se debe cargar (por ejemplo, srt=o&sp=r). Se pueden crear varias firmas de acceso compartido para diferentes casos de uso. Los permisos se deben conceder de la siguiente manera:
    Acción Permiso
    Leer datos desde un archivo Lectura
    Leer datos de varios archivos y subcarpetas Lectura y enumeración
    Usar Create External Table as Select (CETAS) Lectura, creación y escritura

Permisos

Requiere el permiso CONTROL en la base de datos en Azure SQL Managed Instance.

Bloqueo

Toma un bloqueo compartido en el objeto EXTERNAL DATA SOURCE.

Ejemplos

Para ver más ejemplos, consulte Virtualización de datos con Azure SQL Managed Instance.

A Consulta de datos externos de Azure SQL Managed Instance con OPENROWSET o una tabla externa

Para ver más ejemplos, consulte Creación de un origen de datos externo o consulte Virtualización de datos con Azure SQL Managed Instance.

  1. Cree la clave maestra de la base de datos, si no existe.

    -- Optional: Create MASTER KEY if it doesn't exist in the database:
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong Password>'
    GO
    
  2. Cree la credencial con ámbito de base de datos mediante un token de SAS. También puede usar una identidad administrada.

    CREATE DATABASE SCOPED CREDENTIAL MyCredential
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
    SECRET = '<KEY>' ; --Removing leading '?'
    GO
    
  3. Cree el origen de datos externo con la credencial.

    --Create external data source pointing to the file path, and referencing database-scoped credential:
    CREATE EXTERNAL DATA SOURCE MyPrivateExternalDataSource
    WITH (
        LOCATION = 'abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest',
        CREDENTIAL = [MyCredential]
    );
    
  4. Consulte el archivo de datos de Parquet en el origen de datos externo mediante la sintaxis T-SQL OPENROWSET, basándose en la inferencia de esquemas para explorar rápidamente los datos sin conocer el esquema.

    --Query data with OPENROWSET, relying on schema inference.
    SELECT TOP 10 *
    FROM OPENROWSET (
        BULK 'bing_covid-19_data.parquet',
        DATA_SOURCE = 'MyExternalDataSource',
        FORMAT = 'parquet'
    ) AS filerows;
    
  5. O bien, consulte los datos mediante OPENROWSET con la cláusula WITH, en lugar de usar la inferencia de esquemas, que puede consultar el costo de ejecución. La inferencia de esquemas no se admite en archivos .csv.

    --Or, query data using the WITH clause on a CSV, where schema inference is not supported
    SELECT TOP 10 id,
        updated,
        confirmed,
        confirmed_change
    FROM OPENROWSET (
        BULK 'bing_covid-19_data.csv', DATA_SOURCE = 'MyExternalDataSource',
        FORMAT = 'CSV',
        FIRSTROW = 2
    ) WITH (
        id INT,
        updated DATE,
        confirmed INT,
        confirmed_change INT
    ) AS filerows;
    
  6. También puede crear un FORMATO DE ARCHIVO EXTERNO y una TABLA EXTERNA para consultar los datos como una tabla local.

    -- 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
    

Pasos siguientes