CREATE EXTERNAL DATA SOURCE (Transact-SQL)
Crea un'origine dati esterna per l'esecuzione di query con SQL Server, database SQL di Azure, Istanza gestita di SQL di Azure, Azure Synapse Analytics, piattaforma di strumenti analitici (PDW) o SQL Edge di Azure.
Questo articolo fornisce la sintassi, gli argomenti, la sezione Osservazioni, le autorizzazioni ed esempi per qualsiasi prodotto SQL scelto.
Selezionare un prodotto
Nella riga seguente selezionare il nome del prodotto a cui si è interessati. Verranno visualizzate solo le informazioni per tale prodotto.
* SQL Server *
Panoramica: SQL Server 2016
Si applica a: SQL Server 2016 (13.x) e versioni successive
Crea un'origine dati esterna per le query PolyBase. Le origini dati esterne vengono usate per stabilire la connettività e supportano questi casi d'uso principali:
- Virtualizzazione dati e caricamento dati con PolyBase
- Operazioni di caricamento bulk con
BULK INSERT
oOPENROWSET
Nota
Questa sintassi varia in base alla versione di SQL Server. Usare l'elenco a discesa di selezione della versione per scegliere la versione appropriata.
Per visualizzare le funzionalità di SQL Server 2019 (15.x), vedere CREATE EXTERNAL DATA SOURCE.
Per visualizzare le funzionalità di SQL Server 2022 (16.x), visitare CREATE EXTERNAL DATA SOURCE.
Sintassi per SQL Server 2016
Per altre informazioni sulle convenzioni della sintassi, vedere Convenzioni della sintassi 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>]' )
[ ; ]
Argomenti
data_source_name
Specifica il nome definito dall'utente per l'origine dati. Il nome deve essere univoco all'interno del database in SQL Server.
LOCATION = '<prefix>://<path[:port]>'
Fornisce il protocollo di connettività e il percorso dell'origine dati esterna.
Origine dati esterna | Prefisso della posizione del connettore | Percorso | Posizioni supportate per prodotto/servizio | Autenticazione |
---|---|---|---|---|
Cloudera CDH o Hortonworks HDP | hdfs |
<Namenode>[:port] |
Da SQL Server 2016 (13.x) a SQL Server 2019 (15.x) | Autenticazione anonima o di base |
Account di archiviazione di Azure (V2) | wasb[s] |
<container>@<storage_account>.blob.core.windows.net |
A partire da SQL Server 2016 (13.x) Lo spazio dei nomi gerarchico non è supportato |
Archiviazione di Azure chiave dell'account |
Percorso:
<Namenode>
= nome del computer, URI del servizio dei nomi o indirizzo IP diNamenode
nel cluster Hadoop. PolyBase deve risolvere tutti i nomi DNS usati dal cluster Hadoop.port
= porta su cui è in ascolto l'origine dati esterna. Per trovare la porta in Hadoop, si usa il parametro di configurazionefs.defaultFS
. L'impostazione predefinita è 8020.<container>
= contenitore dell'account di archiviazione che include i dati. I contenitori radice sono di sola lettura, di conseguenza i dati non possono essere riscritti nel contenitore.<storage_account>
= nome dell'account di archiviazione della risorsa di Azure.<server_name>
= nome host.<instance_name>
= nome dell'istanza denominata di SQL Server. Usato se il servizio SQL Server Browser Service è in esecuzione nell'istanza di destinazione.
Note aggiuntive e indicazioni utili per l'impostazione della posizione:
- Il motore di database di SQL Server non verifica l'esistenza dell'origine dati esterna quando viene creato l'oggetto. Per eseguire la convalida, creare una tabella esterna usando l'origine dati esterna.
- Per garantire una semantica di esecuzione di query coerente, usare la stessa origine dati esterna per tutte le tabelle quando si eseguono query su Hadoop.
wasbs
è facoltativo, ma consigliato in SQL Server 2016 (13.x) per l'accesso agli account Archiviazione di Azure perché i dati verranno inviati tramite una connessione TLS/SSL sicura.- Per garantire la corretta esecuzione delle query di PolyBase durante un failover di
Namenode
di Hadoop, provare a usare un indirizzo IP virtuale per l'istanza diNamenode
del cluster Hadoop. In caso contrario, eseguire un comando ALTER EXTERNAL DATA SOURCE in modo che punti alla nuova posizione.
CREDENTIAL = credential_name
Specifica una credenziale con ambito database per l'autenticazione nell'origine dati esterna.
CREDENTIAL
è obbligatorio solo se i dati sono stati protetti. CREDENTIAL
non è obbligatorio per i set di dati che consentono l'accesso anonimo.
Per creare credenziali con ambito database, vedere CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL).
TYPE = [ HADOOP ]
Specifica il tipo dell'origine dati esterna da configurare. In SQL Server 2016 questo parametro è sempre obbligatorio e deve essere specificato solo come HADOOP
. Supporta le connessioni a Cloudera CDH, Hortonworks HDP o un account di archiviazione di Azure. Il comportamento di questo parametro è diverso nelle versioni successive di SQL Server.
Per un esempio di utilizzo TYPE
= HADOOP
di per caricare dati da un account Archiviazione di Azure, vedere Creare un'origine dati esterna per accedere ai dati in Archiviazione di Azure usando l'interfaccia wasb://
RESOURCE_MANAGER_LOCATION = 'ResourceManager_URI[:port]'
Configurare questo valore facoltativo quando ci si connette a Cloudera CDH, Hortonworks HDP oppure solo a un account di archiviazione di Azure. Per un elenco completo delle versioni di Hadoop supportate, vedere Configurazione della connettività di PolyBase (Transact-SQL).
RESOURCE_MANAGER_LOCATION
Quando viene definito, Query Optimizer prende una decisione basata sui costi per migliorare le prestazioni. È possibile usare un processo MapReduce per eseguire il pushdown del calcolo in Hadoop. Specificando il parametro RESOURCE_MANAGER_LOCATION
, è possibile ridurre significativamente il volume dei dati trasferiti tra Hadoop e SQL Server e quindi migliorare le prestazioni delle query.
Se non si specifica tale parametro, il push del calcolo in Hadoop è disabilitato per le query PolyBase. In Creare un'origine dati esterna per fare riferimento a Hadoop con il pushdown abilitato viene fornito un esempio concreto, oltre a ulteriori indicazioni.
Il valore RESOURCE_MANAGER_LOCATION non viene convalidato quando si crea l'origine dati esterna. Se si immette un valore errato, potrebbe verificarsi un errore di query in fase di esecuzione quando si prova a usare il pushdown perché non è possibile risolvere il valore specificato.
Affinché PolyBase funzioni correttamente con un'origine dati esterna Hadoop, le porte per i componenti del cluster Hadoop seguenti devono essere aperte:
- Porte HDFS
- Namenode
- Datanode
- Resource Manager
- Invio di processi
- Cronologia dei processi
Se la porta non è specificata, per la scelta del valore predefinito si usa l'impostazione corrente della configurazione 'hadoop connectivity'.
Connettività Hadoop | Porta di gestione risorse predefinita |
---|---|
1 | 50300 |
2 | 50300 |
3 | 8021 |
4 | 8032 |
5 | 8050 |
6 | 8032 |
7 | 8050 |
8 | 8032 |
Nella tabella seguente vengono illustrate le porte predefinite per questi componenti. Esiste una dipendenza della versione di Hadoop e la possibilità di una configurazione personalizzata che non usa l'assegnazione di porta predefinita.
Componente cluster Hadoop | Porta predefinita |
---|---|
NameNode | 8020 |
DataNode (trasferimento di dati, porta IPC senza privilegi) | 50010 |
DataNode (trasferimento dei dati, porta IPC con privilegi) | 1019 |
Invio di processi di Resource Manager (Hortonworks 1.3) | 50300 |
Invio di processi di Resource Manager (Cloudera 4.3) | 8021 |
Invio di processi di Resource Manager (Hortonworks 2.0 in Windows, Cloudera 5.x in Linux) | 8032 |
Invio di processi di Resource Manager (Hortonworks 2.x, 3.0 in Linux, Hortonworks 2.1-3 in Windows) | 8050 |
Cronologia processi di Resource Manager | 10020 |
Autorizzazioni
Richiede l'autorizzazione CONTROL
nel database in SQL Server.
Blocco
Acquisisce un blocco condiviso per l'oggetto EXTERNAL DATA SOURCE
.
Sicurezza
PolyBase supporta l'autenticazione basata su proxy per la maggior parte delle origini dati esterne. Creare credenziali con ambito database per creare l'account proxy.
Esempi
Importante
Per informazioni su come installare e abilitare PolyBase, vedere Installare PolyBase in Windows
R. Creare un'origine dati esterna per fare riferimento a Hadoop
Per creare un'origine dati esterna per fare riferimento al cluster Hortonworks HDP o Cloudera CDH Hadoop, specificare il nome del computer o l'indirizzo IP di Namenode
Hadoop e la porta.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8050',
TYPE = HADOOP
);
B. Creare un'origine dati esterna per fare riferimento a Hadoop con il pushdown abilitato
Specificare l'opzione RESOURCE_MANAGER_LOCATION
per abilitare il pushdown del calcolo in Hadoop per le query PolyBase. Dopo l'abilitazione, PolyBase prende una decisione basata sui costi per determinare se eseguire il push del calcolo delle query in 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. Creare un'origine dati esterna per fare riferimento a Hadoop con protezione Kerberos
Per verificare se il cluster Hadoop è protetto tramite Kerberos, controllare il valore della proprietà hadoop.security.authentication
nel file core-site.xml di Hadoop. Per fare riferimento a un cluster Hadoop protetto tramite Kerberos, è necessario specificare una credenziale con ambito database che contiene il nome utente e la password di Kerberos. La chiave master del database viene usata per crittografare il segreto della credenziale con ambito database.
-- 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. Creare un'origine dati esterna per accedere ai dati in Archiviazione di Azure usando l'interfaccia wasb://
In questo esempio, l'origine dati esterna è un account di Archiviazione di Azure V2 denominato logs
. Il contenitore di archiviazione è denominato daily
. L'origine dati esterna di Archiviazione di Azure è destinata al solo trasferimento dei dati e non supporta il pushdown dei predicati. Gli spazi dei nomi gerarchici non sono supportati quando si accede ai dati tramite l'interfaccia wasb://
.
Questo esempio illustra come creare le credenziali con ambito di database per l'autenticazione in un account di Archiviazione di Azure V2. Specificare la chiave dell'account di Archiviazione di Azure nel segreto della credenziale di database. È possibile specificare qualsiasi stringa nell'identità della credenziale con ambito database perché non viene usata durante l'autenticazione in Archiviazione di Azure. Si noti che quando ci si connette ad Archiviazione di Azure tramite il connettore WASB[s], l'autenticazione deve essere eseguita con una chiave dell'account di archiviazione e non con una firma di accesso condiviso.
In SQL Server 2016 (13.x) è necessario impostare TYPE
su HADOOP
anche quando si accede ad Archiviazione di Azure.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
SECRET = '<azure_storage_account_key>';
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
Passaggi successivi
Panoramica: SQL Server 2017
Si applica a: solo SQL Server 2017 (14.x)
Crea un'origine dati esterna per le query PolyBase. Le origini dati esterne vengono usate per stabilire la connettività e supportano questi casi d'uso principali:
- Virtualizzazione dati e caricamento dati con PolyBase
- Operazioni di caricamento bulk con
BULK INSERT
oOPENROWSET
Nota
Questa sintassi varia in base alla versione di SQL Server in Linux. Usare l'elenco a discesa di selezione della versione per scegliere la versione appropriata.
Per visualizzare le funzionalità di SQL Server 2019 (15.x), vedere CREATE EXTERNAL DATA SOURCE.
Per visualizzare le funzionalità di SQL Server 2022 (16.x), visitare CREATE EXTERNAL DATA SOURCE.
Nota
Questa sintassi varia in base alla versione di SQL Server. Usare l'elenco a discesa di selezione della versione per scegliere la versione appropriata.
Per visualizzare le funzionalità di SQL Server 2019 (15.x), vedere CREATE EXTERNAL DATA SOURCE.
Per visualizzare le funzionalità di SQL Server 2022 (16.x), visitare CREATE EXTERNAL DATA SOURCE.
Sintassi per SQL Server 2017
Per altre informazioni sulle convenzioni della sintassi, vedere Convenzioni della sintassi 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>]' )
[ ; ]
Argomenti
data_source_name
Specifica il nome definito dall'utente per l'origine dati. Il nome deve essere univoco all'interno del database in SQL Server.
LOCATION = '<prefix>://<path[:port]>'
Fornisce il protocollo di connettività e il percorso dell'origine dati esterna.
Origine dati esterna | Prefisso della posizione del connettore | Percorso | Posizioni supportate per prodotto/servizio | Autenticazione |
---|---|---|---|---|
Cloudera CDH o Hortonworks HDP | hdfs |
<Namenode>[:port] |
Da SQL Server 2016 (13.x) a SQL Server 2019 (15.x) esclusivamente | Autenticazione anonima o di base |
Account di archiviazione di Azure (V2) | wasb[s] |
<container>@<storage_account>.blob.core.windows.net |
A partire da SQL Server 2016 (13.x) Lo spazio dei nomi gerarchico non è supportato |
Archiviazione di Azure chiave dell'account |
Operazioni bulk | https |
<storage_account>.blob.core.windows.net/<container> |
A partire da SQL Server 2017 (14.x) | Firma di accesso condiviso (SAS) |
Percorso:
<
Namenode>
= nome del computer, URI del servizio dei nomi o indirizzo IP diNamenode
nel cluster Hadoop. PolyBase deve risolvere tutti i nomi DNS usati dal cluster Hadoop.port
= porta su cui è in ascolto l'origine dati esterna. Per trovare la porta in Hadoop, si usa il parametro di configurazionefs.defaultFS
. L'impostazione predefinita è 8020.<container>
= contenitore dell'account di archiviazione che include i dati. I contenitori radice sono di sola lettura, di conseguenza i dati non possono essere riscritti nel contenitore.<storage_account>
= nome dell'account di archiviazione della risorsa di Azure.<server_name>
= nome host.<instance_name>
= nome dell'istanza denominata di SQL Server. Usato se il servizio SQL Server Browser Service è in esecuzione nell'istanza di destinazione.
Note aggiuntive e indicazioni utili per l'impostazione della posizione:
- Il motore di database di SQL Server non verifica l'esistenza dell'origine dati esterna quando viene creato l'oggetto. Per eseguire la convalida, creare una tabella esterna usando l'origine dati esterna.
- Per garantire una semantica di esecuzione di query coerente, usare la stessa origine dati esterna per tutte le tabelle quando si eseguono query su Hadoop.
- Per la connessione tramite
ODBC
specificareDriver={<Name of Driver>}
. wasbs
è facoltativo, ma consigliato in SQL Server 2017 (14.x) per l'accesso agli account Archiviazione di Azure perché i dati verranno inviati usando una connessione TLS/SSL sicura.- Per garantire la corretta esecuzione delle query di PolyBase durante un failover di
Namenode
di Hadoop, provare a usare un indirizzo IP virtuale per l'istanza diNamenode
del cluster Hadoop. In caso contrario, eseguire un comando ALTER EXTERNAL DATA SOURCE in modo che punti alla nuova posizione.
CREDENTIAL = credential_name
Specifica una credenziale con ambito database per l'autenticazione nell'origine dati esterna.
Note aggiuntive e indicazioni utili per la creazione delle credenziali:
CREDENTIAL
è obbligatorio solo se i dati sono stati protetti.CREDENTIAL
non è obbligatorio per i set di dati che consentono l'accesso anonimo.- Quando
TYPE
=BLOB_STORAGE
, è necessario creare le credenziali usandoSHARED ACCESS SIGNATURE
come identità. TYPE
=BLOB_STORAGE
si può usare solo per le operazioni bulk e non è possibile creare tabelle esterne per un'origine dati esterna conTYPE
=BLOB_STORAGE
.- Si noti che quando ci si connette ad Archiviazione di Azure tramite il connettore WASB[s], l'autenticazione deve essere eseguita con una chiave dell'account di archiviazione e non con una firma di accesso condiviso.
- Quando
TYPE
=HADOOP
è necessario creare le credenziali usando la chiave dell'account di archiviazione comeSECRET
.
Esistono diversi modi per creare una firma di accesso condiviso:
È possibile creare un token di firma di accesso condiviso passando alla portale di Azure -><Your_Storage_Account> - Firma di accesso condiviso -> Configurare le autorizzazioni ->> Generare firma di accesso condiviso e stringa di connessione. Per altre informazioni, vedere Generare una firma di accesso condiviso.
È possibile creare e configurare una firma di accesso condiviso con Archiviazione di Azure Explorer.
È possibile creare una firma di accesso condiviso a livello di codice tramite PowerShell, l'interfaccia della riga di comando di Azure, .NET e l'API REST. Per altre informazioni, vedere Concedere accesso limitato alle risorse di Archiviazione di Azure tramite firme di accesso condiviso.
Il token di firma di accesso condiviso deve essere configurato come segue:
- Quando viene generato, il token di firma di accesso condiviso è preceduto da un punto interrogativo ('?'). Escludere l'elemento iniziale
?
quando configurato come SECRET. - Usare un periodo di scadenza valido (tutte le date sono espresse in formato UTC).
- Concedere almeno l'autorizzazione di lettura per il file che deve essere caricato ( ad esempio
srt=o&sp=r
). È possibile creare più firme di accesso condiviso per casi d'uso diversi. Le autorizzazioni devono essere concesse come segue:
Azione Autorizzazione Lettura di dati da un file Lettura Leggere i dati da più file e sottocartelle Lettura e Lista - Quando viene generato, il token di firma di accesso condiviso è preceduto da un punto interrogativo ('?'). Escludere l'elemento iniziale
Per un esempio d'uso di CREDENTIAL
con SHARED ACCESS SIGNATURE
e TYPE
= BLOB_STORAGE
, vedere Creare un'origine dati esterna per eseguire operazioni bulk e recuperare dati da Archiviazione di Azure nel database SQL
Per creare credenziali con ambito database, vedere CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL).
TYPE = [ HADOOP | BLOB_STORAGE ]
Specifica il tipo dell'origine dati esterna da configurare. Questo parametro non è sempre necessario e deve essere specificato solo quando ci si connette a Cloudera CDH, Hortonworks HDP, un account di archiviazione di Azure o un'istanza di Azure Data Lake Storage Gen2.
- Usare
HADOOP
quando l'origine dati esterna è Cloudera CDH, Hortonworks HDP, un account di archiviazione di Azure o un'istanza di Azure Data Lake Storage Gen2. - Usare
BLOB_STORAGE
quando si eseguono operazioni bulk dall'account di archiviazione di Azure usando BULK INSERT o OPENROWSET. Opzione introdotta con SQL Server 2017 (14.x). UsareHADOOP
quando si vuole eseguire l'istruzione CREATE EXTERNAL TABLE in Archiviazione di Azure.
Nota
È necessario impostare TYPE
su HADOOP
anche quando si accede ad Archiviazione di Azure.
Per un esempio di utilizzo TYPE
= HADOOP
di per caricare dati da un account Archiviazione di Azure, vedere Creare un'origine dati esterna per accedere ai dati in Archiviazione di Azure usando l'interfaccia wasb://
RESOURCE_MANAGER_LOCATION = 'ResourceManager_URI[:port]'
Configurare questo valore facoltativo quando ci si connette a Cloudera CDH, Hortonworks HDP oppure solo a un account di archiviazione di Azure. Per un elenco completo delle versioni di Hadoop supportate, vedere Configurazione della connettività di PolyBase (Transact-SQL).
Dopo aver definito RESOURCE_MANAGER_LOCATION
, Query Optimizer prenderà una decisione basata sui costi per migliorare le prestazioni. È possibile usare un processo MapReduce per eseguire il pushdown del calcolo in Hadoop. Specificando il parametro RESOURCE_MANAGER_LOCATION
, è possibile ridurre significativamente il volume dei dati trasferiti tra Hadoop e SQL Server e quindi migliorare le prestazioni delle query.
Se non si specifica tale parametro, il push del calcolo in Hadoop è disabilitato per le query PolyBase. In Creare un'origine dati esterna per fare riferimento a Hadoop con il pushdown abilitato viene fornito un esempio concreto, oltre a ulteriori indicazioni.
Il valore RESOURCE_MANAGER_LOCATION non viene convalidato quando si crea l'origine dati esterna. Se si immette un valore errato, potrebbe verificarsi un errore di query in fase di esecuzione quando si prova a usare il pushdown perché non è possibile risolvere il valore specificato.
Affinché PolyBase funzioni correttamente con un'origine dati esterna Hadoop, le porte per i componenti del cluster Hadoop seguenti devono essere aperte:
- Porte HDFS
- Namenode
- Datanode
- Resource Manager
- Invio di processi
- Cronologia dei processi
Se la porta non è specificata, per la scelta del valore predefinito si usa l'impostazione corrente della configurazione 'hadoop connectivity'.
Connettività Hadoop | Porta di gestione risorse predefinita |
---|---|
1 | 50300 |
2 | 50300 |
3 | 8021 |
4 | 8032 |
5 | 8050 |
6 | 8032 |
7 | 8050 |
8 | 8032 |
Nella tabella seguente vengono illustrate le porte predefinite per questi componenti. Si noti che esiste una dipendenza della versione di Hadoop e la possibilità di una configurazione personalizzata che non usa l'assegnazione di porta predefinita.
Componente cluster Hadoop | Porta predefinita |
---|---|
NameNode | 8020 |
DataNode (trasferimento di dati, porta IPC senza privilegi) | 50010 |
DataNode (trasferimento dei dati, porta IPC con privilegi) | 1019 |
Invio di processi di Resource Manager (Hortonworks 1.3) | 50300 |
Invio di processi di Resource Manager (Cloudera 4.3) | 8021 |
Invio di processi di Resource Manager (Hortonworks 2.0 in Windows, Cloudera 5.x in Linux) | 8032 |
Invio di processi di Resource Manager (Hortonworks 2.x, 3.0 in Linux, Hortonworks 2.1-3 in Windows) | 8050 |
Cronologia processi di Resource Manager | 10020 |
Autorizzazioni
Richiede l'autorizzazione CONTROL
nel database in SQL Server.
Blocco
Acquisisce un blocco condiviso per l'oggetto EXTERNAL DATA SOURCE
.
Sicurezza
PolyBase supporta l'autenticazione basata su proxy per la maggior parte delle origini dati esterne. Creare credenziali con ambito database per creare l'account proxy.
Il token di firma di accesso condiviso di tipo HADOOP
non è supportato. È supportato solo il tipo BLOB_STORAGE
quando viene usata una chiave di accesso dell'account di archiviazione. Il tentativo di creare un'origine dati esterna di tipo HADOOP
e le credenziali di firma di accesso condiviso potrebbe non riuscire e potrebbe essere visualizzato l'errore:
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.'
Esempi
Importante
Per informazioni su come installare e abilitare PolyBase, vedere Installare PolyBase in Windows
R. Creare un'origine dati esterna per fare riferimento a Hadoop
Per creare un'origine dati esterna per fare riferimento al cluster Hortonworks HDP o Cloudera CDH Hadoop, specificare il nome del computer o l'indirizzo IP di Namenode
Hadoop e la porta.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8050',
TYPE = HADOOP
);
B. Creare un'origine dati esterna per fare riferimento a Hadoop con il pushdown abilitato
Specificare l'opzione RESOURCE_MANAGER_LOCATION
per abilitare il pushdown del calcolo in Hadoop per le query PolyBase. Dopo l'abilitazione, PolyBase prende una decisione basata sui costi per determinare se eseguire il push del calcolo delle query in 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. Creare un'origine dati esterna per fare riferimento a Hadoop con protezione Kerberos
Per verificare se il cluster Hadoop è protetto tramite Kerberos, controllare il valore della proprietà hadoop.security.authentication
nel file core-site.xml di Hadoop. Per fare riferimento a un cluster Hadoop protetto tramite Kerberos, è necessario specificare una credenziale con ambito database che contiene il nome utente e la password di Kerberos. La chiave master del database viene usata per crittografare il segreto della credenziale con ambito database.
-- 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. Creare un'origine dati esterna per accedere ai dati in Archiviazione di Azure usando l'interfaccia wasb://
In questo esempio, l'origine dati esterna è un account di Archiviazione di Azure V2 denominato logs
. Il contenitore di archiviazione è denominato daily
. L'origine dati esterna di Archiviazione di Azure è destinata al solo trasferimento dei dati e non supporta il pushdown dei predicati. Gli spazi dei nomi gerarchici non sono supportati quando si accede ai dati tramite l'interfaccia wasb://
. Si noti che quando ci si connette ad Archiviazione di Azure tramite il connettore WASB[s], l'autenticazione deve essere eseguita con una chiave dell'account di archiviazione e non con una firma di accesso condiviso.
Questo esempio illustra come creare le credenziali con ambito di database per l'autenticazione in un account di Archiviazione di Azure V2. Specificare la chiave dell'account di Archiviazione di Azure nel segreto della credenziale di database. È possibile specificare qualsiasi stringa nell'identità della credenziale con ambito database perché non viene usata durante l'autenticazione in Archiviazione di Azure.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
SECRET = '<azure_storage_account_key>';
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
Esempi: operazioni bulk
Importante
Non aggiungere un carattere / finale, un nome file o parametri di firma per l'accesso condiviso alla fine dell'URL LOCATION
quando si configura un'origine dati esterne per le operazioni bulk.
E. Creare un'origine dati esterna per le operazioni bulk che recuperano i dati da Archiviazione di Azure
Si applica a: SQL Server 2017 (14.x) e versioni successive.
Usare l'origine dati seguente per le operazioni bulk che usano BULK INSERT o OPENROWSET. Le credenziali devono impostare SHARED ACCESS SIGNATURE
come identità, non devono includere il carattere ?
iniziale nel token di firma di accesso condiviso, devono avere almeno un'autorizzazione di lettura per il file da caricare (ad esempio srt=o&sp=r
). Inoltre il periodo di scadenza deve essere valido (tutte le date sono in formato UTC). Per altre informazioni sulle firme di accesso condiviso, vedere Uso delle firme di accesso condiviso.
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
);
Per un esempio pratico, vedere l'esempio di BULK INSERT.
Passaggi successivi
Panoramica: SQL Server 2019
Si applica a: SQL Server 2019 (15.x) e versioni successive
Crea un'origine dati esterna per le query PolyBase. Le origini dati esterne vengono usate per stabilire la connettività e supportano questi casi d'uso principali:
- Virtualizzazione dati e caricamento dati con PolyBase
- Operazioni di caricamento bulk con
BULK INSERT
oOPENROWSET
Nota
Questa sintassi varia in base alla versione di SQL Server. Usare l'elenco a discesa di selezione della versione per scegliere la versione appropriata.
Per visualizzare le funzionalità di SQL Server 2022 (16.x), visitare CREATE EXTERNAL DATA SOURCE.
Nota
Questa sintassi varia in base alla versione di SQL Server. Usare l'elenco a discesa di selezione della versione per scegliere la versione appropriata.
Per visualizzare le funzionalità di SQL Server 2022 (16.x), visitare CREATE EXTERNAL DATA SOURCE.
Sintassi per SQL Server 2019
Per altre informazioni sulle convenzioni della sintassi, vedere Convenzioni della sintassi 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>]' )
[ ; ]
Argomenti
data_source_name
Specifica il nome definito dall'utente per l'origine dati. Il nome deve essere univoco all'interno del database in SQL Server.
LOCATION = '<prefix>://<path[:port]>'
Fornisce il protocollo di connettività e il percorso dell'origine dati esterna.
Origine dati esterna | Prefisso della posizione del connettore | Percorso | Posizioni supportate per prodotto/servizio | Autenticazione |
---|---|---|---|---|
Cloudera CDH o Hortonworks HDP | hdfs |
<Namenode>[:port] |
Da SQL Server 2016 (13.x) a SQL Server 2019 (15.x) | Autenticazione anonima o di base |
Account di archiviazione di Azure (V2) | wasb[s] |
<container>@<storage_account>.blob.core.windows.net |
A partire da SQL Server 2016 (13.x) Lo spazio dei nomi gerarchico non è supportato |
Archiviazione di Azure chiave dell'account |
SQL Server | sqlserver |
<server_name>[\<instance_name>][:port] |
A partire da SQL Server 2019 (15.x) | Solo autenticazione SQL |
Oracle | oracle |
<server_name>[:port] |
A partire da SQL Server 2019 (15.x) | Solo autenticazione di base |
Teradata | teradata |
<server_name>[:port] |
A partire da SQL Server 2019 (15.x) | Solo autenticazione di base |
MongoDB o API Cosmos DB per MongoDB | mongodb |
<server_name>[:port] |
A partire da SQL Server 2019 (15.x) | Solo autenticazione di base |
ODBC generico | odbc |
<server_name>[:port] |
A partire da SQL Server 2019 (15.x) - Solo Windows | Solo autenticazione di base |
Operazioni bulk | https |
<storage_account>.blob.core.windows.net/<container> |
A partire da SQL Server 2017 (14.x) | Firma di accesso condiviso (SAS) |
Azure Data Lake Storage Gen2 | abfs[s] |
abfss://<container>@<storage _account>.dfs.core.windows.net |
A partire da SQL Server 2019 (15.x) CU11+. | Storage Access Key (Chiave di accesso alle risorse di archiviazione) |
Pool di dati di cluster Big Data di SQL Server | sqldatapool |
sqldatapool://controller-svc/default |
Supportato solo in cluster Big Data di SQL Server 2019 | Solo autenticazione di base |
Pool di archiviazione di cluster Big Data di SQL Server | sqlhdfs |
sqlhdfs://controller-svc/default |
Supportato solo in cluster Big Data di SQL Server 2019 | Solo autenticazione di base |
Percorso:
<Namenode>
= nome del computer, URI del servizio dei nomi o indirizzo IP diNamenode
nel cluster Hadoop. PolyBase deve risolvere tutti i nomi DNS usati dal cluster Hadoop.port
= porta su cui è in ascolto l'origine dati esterna. Per trovare la porta in Hadoop, si usa il parametro di configurazionefs.defaultFS
. L'impostazione predefinita è 8020.<container>
= contenitore dell'account di archiviazione che include i dati. I contenitori radice sono di sola lettura, di conseguenza i dati non possono essere riscritti nel contenitore.<storage_account>
= nome dell'account di archiviazione della risorsa di Azure.<server_name>
= nome host.<instance_name>
= nome dell'istanza denominata di SQL Server. Usato se il servizio SQL Server Browser Service è in esecuzione nell'istanza di destinazione.
Note aggiuntive e indicazioni utili per l'impostazione della posizione:
- Il motore di database di SQL Server non verifica l'esistenza dell'origine dati esterna quando viene creato l'oggetto. Per eseguire la convalida, creare una tabella esterna usando l'origine dati esterna.
- Per garantire una semantica di esecuzione di query coerente, usare la stessa origine dati esterna per tutte le tabelle quando si eseguono query su Hadoop.
- È possibile usare il
sqlserver
connettore per connettere SQL Server 2019 (15.x) a un altro SQL Server o a database SQL di Azure. - Per la connessione tramite
ODBC
specificareDriver={<Name of Driver>}
. - L'uso
wasbs
di oabfss
è facoltativo, ma consigliato in SQL Server 2019 (15.x) per l'accesso agli account Archiviazione di Azure come dati verranno inviati usando una connessione TLS/SSL sicura. - Le API
abfs
eabfss
sono supportate quando si accede agli account di archiviazione di Azure a partire da SQL Server 2019 (15.x) CU11. Per altre informazioni, vedere Driver ABFS (Azure Blob File System). - L'opzione Spazio dei nomi gerarchico per gli account di archiviazione di Azure (V2) con
abfs[s]
è supportata tramite Azure Data Lake Storage Gen2 a partire da SQL Server 2019 (15.x) CU11+. Negli altri casi, l'opzione Spazio dei nomi gerarchico non è supportata e deve rimanere disabilitata. - Per garantire la corretta esecuzione delle query di PolyBase durante un failover di
Namenode
di Hadoop, provare a usare un indirizzo IP virtuale per l'istanza diNamenode
del cluster Hadoop. In caso contrario, eseguire un comando ALTER EXTERNAL DATA SOURCE in modo che punti alla nuova posizione. - I tipi
sqlhdfs
esqldatapool
sono supportati per la connessione tra l'istanza master e il pool di archiviazione di un cluster Big Data. Per Cloudera CDH o Hortonworks HDP, usarehdfs
. Per altre informazioni sull'uso disqlhdfs
per eseguire query sui pool di archiviazione di cluster Big Data di SQL Server, vedere Eseguire query su dati HDFS in un cluster Big Data di SQL Server 2019. - Il supporto di SQL Server per le origini dati esterne HDFS Cloudera (CDP) e Hortonworks (HDP) sarà ritirato e non sarà disponibile in SQL Server 2022 (16.x). Per altre informazioni, vedere Opzioni per i Big Data nella piattaforma Microsoft SQL Server.
CONNECTION_OPTIONS = key_value_pair
Per SQL Server 2019 (15.x) e versioni successive. Specifica le opzioni aggiuntive quando si esegue la connessione a un'origine dati esterna tramite ODBC
. Per usare più opzioni di connessione, separarle con un punto e virgola.
Si applica alle connessioni ODBC
generiche, nonché ai connettori ODBC
predefiniti per SQL Server, Oracle, Teradata, MongoDB e l'API Azure Cosmos DB per MongoDB.
key_value_pair
rappresenta la parola chiave e il valore per un'opzione di connessione specifica. Le parole chiave e i valori disponibili dipendono dal tipo di origine dati esterna. Il nome del driver è un requisito minimo, ma sono disponibili altre opzioni, ad esempio APP='<your_application_name>'
o ApplicationIntent= ReadOnly|ReadWrite
, che può essere utile impostare e possono essere usate per la risoluzione dei problemi.
Le possibili coppie chiave-valore sono specifiche del provider per il fornitore dell'origine dati esterna. Per altre informazioni su ogni provider, vedere CREATE EXTERNAL DATA SOURCE (Transact-SQL) CONNECTION_OPTIONS.
A partire dall'aggiornamento cumulativo 19 di SQL Server 2019 (15.x), sono state introdotte parole chiave aggiuntive per supportare i file Oracle TNS:
- La parola chiave
TNSNamesFile
specifica il percorso file deltnsnames.ora
file che si trova nel server Oracle. - La parola chiave
ServerName
specifica l'alias usato all'interno ditnsnames.ora
che verrà usato per sostituire il nome host e la porta.
Pushdown = ON | OFF
Solo per SQL Server 2019 (15.x). Indica se è possibile eseguire il pushdown del calcolo nell'origine dati esterna. L'impostazione predefinita è ON.
PUSHDOWN
è supportato per la connessione a SQL Server, Oracle, Teradata, MongoDB, l'API Azure Cosmos BDB per MongoDB o ODBC a livello di origine dati esterna.
Per abilitare o disabilitare il pushdown a livello di query, si usa un hint.
CREDENTIAL = credential_name
Specifica una credenziale con ambito database per l'autenticazione nell'origine dati esterna.
Note aggiuntive e indicazioni utili per la creazione delle credenziali:
CREDENTIAL
è obbligatorio solo se i dati sono stati protetti.CREDENTIAL
non è obbligatorio per i set di dati che consentono l'accesso anonimo.- Quando
TYPE
=BLOB_STORAGE
, è necessario creare le credenziali usandoSHARED ACCESS SIGNATURE
come identità.TYPE
=BLOB_STORAGE
si può usare solo per le operazioni bulk e non è possibile creare tabelle esterne per un'origine dati esterna conTYPE
=BLOB_STORAGE
.
Esistono diversi modi per creare una firma di accesso condiviso:
È possibile creare un token di firma di accesso condiviso passando alla portale di Azure -><Your_Storage_Account> - Firma di accesso condiviso -> Configurare le autorizzazioni ->> Generare firma di accesso condiviso e stringa di connessione. Per altre informazioni, vedere Generare una firma di accesso condiviso.
È possibile creare e configurare una firma di accesso condiviso con Archiviazione di Azure Explorer.
È possibile creare una firma di accesso condiviso a livello di codice tramite PowerShell, l'interfaccia della riga di comando di Azure, .NET e l'API REST. Per altre informazioni, vedere Concedere accesso limitato alle risorse di Archiviazione di Azure tramite firme di accesso condiviso.
Il token di firma di accesso condiviso deve essere configurato come segue:
- Quando viene generato, il token di firma di accesso condiviso è preceduto da un punto interrogativo ('?'). Escludere l'elemento iniziale
?
quando configurato come SECRET. - Usare un periodo di scadenza valido (tutte le date sono espresse in formato UTC).
- Concedere almeno l'autorizzazione di lettura per il file che deve essere caricato ( ad esempio
srt=o&sp=r
). È possibile creare più firme di accesso condiviso per casi d'uso diversi. Le autorizzazioni devono essere concesse come segue:
Azione Autorizzazione Lettura di dati da un file Lettura Leggere i dati da più file e sottocartelle Lettura e Lista - Quando viene generato, il token di firma di accesso condiviso è preceduto da un punto interrogativo ('?'). Escludere l'elemento iniziale
Per un esempio d'uso di CREDENTIAL
con SHARED ACCESS SIGNATURE
e TYPE
= BLOB_STORAGE
, vedere Creare un'origine dati esterna per eseguire operazioni bulk e recuperare dati da Archiviazione di Azure nel database SQL
Per creare credenziali con ambito database, vedere CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL).
TYPE = [ HADOOP | BLOB_STORAGE ]
Specifica il tipo dell'origine dati esterna da configurare. Questo parametro non è sempre necessario e deve essere specificato solo quando ci si connette a Cloudera CDH, Hortonworks HDP, un account di archiviazione di Azure o un'istanza di Azure Data Lake Storage Gen2.
- In SQL Server 2019 (15.x) non specificare TYPE a meno che non ci si connetta a Cloudera CDH, Hortonworks HDP o un account di archiviazione di Azure.
- Usare
HADOOP
quando l'origine dati esterna è Cloudera CDH, Hortonworks HDP, un account di archiviazione di Azure o un'istanza di Azure Data Lake Storage Gen2. - Usare
BLOB_STORAGE
quando si eseguono operazioni bulk dall'account di archiviazione di Azure usando BULK INSERT o OPENROWSET con SQL Server 2017 (14.x). UsareHADOOP
quando si vuole eseguire l'istruzione CREATE EXTERNAL TABLE in Archiviazione di Azure. - Il supporto di SQL Server per le origini dati esterne HDFS Cloudera (CDP) e Hortonworks (HDP) sarà ritirato e non sarà disponibile in SQL Server 2022 (16.x). Per altre informazioni, vedere Opzioni per i Big Data nella piattaforma Microsoft SQL Server.
Per un esempio di utilizzo TYPE
= HADOOP
di per caricare dati da un account Archiviazione di Azure, vedere Creare un'origine dati esterna per accedere ai dati in Archiviazione di Azure usando l'interfaccia wasb://
RESOURCE_MANAGER_LOCATION = 'ResourceManager_URI[:port]'
In SQL Server 2019 (15.x) non specificare RESOURCE_MANAGER_LOCATION a meno che non ci si connetta a Cloudera CDH, Hortonworks HDP o un account di archiviazione di Azure.
Configurare questo valore facoltativo quando ci si connette a Cloudera CDH, Hortonworks HDP oppure solo a un account di archiviazione di Azure. Per un elenco completo delle versioni di Hadoop supportate, vedere Configurazione della connettività di PolyBase (Transact-SQL).
RESOURCE_MANAGER_LOCATION
Quando viene definito, Query Optimizer prende una decisione basata sui costi per migliorare le prestazioni. È possibile usare un processo MapReduce per eseguire il pushdown del calcolo in Hadoop. Specificando il parametro RESOURCE_MANAGER_LOCATION
, è possibile ridurre significativamente il volume dei dati trasferiti tra Hadoop e SQL Server e quindi migliorare le prestazioni delle query.
Se non si specifica tale parametro, il push del calcolo in Hadoop è disabilitato per le query PolyBase. In Creare un'origine dati esterna per fare riferimento a Hadoop con il pushdown abilitato viene fornito un esempio concreto, oltre a ulteriori indicazioni.
Il valore RESOURCE_MANAGER_LOCATION non viene convalidato quando si crea l'origine dati esterna. Se si immette un valore errato, potrebbe verificarsi un errore di query in fase di esecuzione quando si prova a usare il pushdown perché non è possibile risolvere il valore specificato.
Affinché PolyBase funzioni correttamente con un'origine dati esterna Hadoop, le porte per i componenti del cluster Hadoop seguenti devono essere aperte:
- Porte HDFS
- Namenode
- Datanode
- Resource Manager
- Invio di processi
- Cronologia dei processi
Se la porta non è specificata, per la scelta del valore predefinito si usa l'impostazione corrente della configurazione 'hadoop connectivity'.
Connettività Hadoop | Porta di gestione risorse predefinita |
---|---|
1 | 50300 |
2 | 50300 |
3 | 8021 |
4 | 8032 |
5 | 8050 |
6 | 8032 |
7 | 8050 |
8 | 8032 |
Nella tabella seguente vengono illustrate le porte predefinite per questi componenti. Si noti che esiste una dipendenza della versione di Hadoop e la possibilità di una configurazione personalizzata che non usa l'assegnazione di porta predefinita.
Componente cluster Hadoop | Porta predefinita |
---|---|
NameNode | 8020 |
DataNode (trasferimento di dati, porta IPC senza privilegi) | 50010 |
DataNode (trasferimento dei dati, porta IPC con privilegi) | 1019 |
Invio di processi di Resource Manager (Hortonworks 1.3) | 50300 |
Invio di processi di Resource Manager (Cloudera 4.3) | 8021 |
Invio di processi di Resource Manager (Hortonworks 2.0 in Windows, Cloudera 5.x in Linux) | 8032 |
Invio di processi di Resource Manager (Hortonworks 2.x, 3.0 in Linux, Hortonworks 2.1-3 in Windows) | 8050 |
Cronologia processi di Resource Manager | 10020 |
Autorizzazioni
Richiede l'autorizzazione CONTROL
nel database in SQL Server.
Blocco
Acquisisce un blocco condiviso per l'oggetto EXTERNAL DATA SOURCE
.
Sicurezza
PolyBase supporta l'autenticazione basata su proxy per la maggior parte delle origini dati esterne. Creare credenziali con ambito database per creare l'account proxy.
Quando ci si connette al pool di archiviazione o al pool di dati in un cluster Big Data di SQL Server 2019, le credenziali dell'utente vengono passate attraverso il sistema back-end. Creare gli account di accesso direttamente nel pool di dati per abilitare l'autenticazione pass-through.
Il token di firma di accesso condiviso di tipo HADOOP
non è supportato. È supportato solo il tipo BLOB_STORAGE
quando viene usata una chiave di accesso dell'account di archiviazione. Il tentativo di creare un'origine dati esterna di tipo HADOOP
e le credenziali di firma di accesso condiviso potrebbe non riuscire e potrebbe essere visualizzato l'errore:
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.'
Esempi
Importante
Per informazioni su come installare e abilitare PolyBase, vedere Installare PolyBase in Windows
R. Creare un'origine dati esterna in SQL Server 2019 per fare riferimento a Oracle
Per creare un'origine dati esterna che fa riferimento a Oracle, assicurarsi di disporre di credenziali con ambito database. È anche possibile abilitare o disabilitare il pushdown del calcolo su questa origine dati.
-- 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
);
Facoltativamente, l'origine dati esterna a Oracle può usare l'autenticazione proxy per fornire un controllo di accesso con granularità fine. Un utente proxy può essere configurato in modo che abbia accesso limitato rispetto all'utente rappresentato.
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]
);
In alternativa, è possibile usare l'autenticazione TNS.
A partire da SQL Server 2019 (15.x) aggiornamento cumulativo 19, CREATE EXTERNAL DATA SOURCE
ora supporta l'uso di file TNS durante la connessione a Oracle.
Il CONNECTION_OPTIONS
parametro è stato espanso e ora usa TNSNamesFile
e ServerName
come variabili per esplorare il tnsnames.ora
file e stabilire la connessione con il server.
Nell'esempio seguente, durante il runtime SQL Server cercherà il percorso del tnsnames.ora
file specificato da TNSNamesFile
e cercherà l'host e la porta di rete specificata da 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'
);
Per altri esempi relativi a origini dati diverse, come MongoDB, vedere Configurare PolyBase per l'accesso a dati esterni in MongoDB.
B. Creare un'origine dati esterna per fare riferimento a Hadoop
Per creare un'origine dati esterna per fare riferimento al cluster Hortonworks HDP o Cloudera CDH Hadoop, specificare il nome del computer o l'indirizzo IP di Namenode
Hadoop e la porta.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8050',
TYPE = HADOOP
);
C. Creare un'origine dati esterna per fare riferimento a Hadoop con il pushdown abilitato
Specificare l'opzione RESOURCE_MANAGER_LOCATION
per abilitare il pushdown del calcolo in Hadoop per le query PolyBase. Dopo l'abilitazione, PolyBase prende una decisione basata sui costi per determinare se eseguire il push del calcolo delle query in 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. Creare un'origine dati esterna per fare riferimento a Hadoop con protezione Kerberos
Per verificare se il cluster Hadoop è protetto tramite Kerberos, controllare il valore della proprietà hadoop.security.authentication
nel file core-site.xml di Hadoop. Per fare riferimento a un cluster Hadoop protetto tramite Kerberos, è necessario specificare una credenziale con ambito database che contiene il nome utente e la password di Kerberos. La chiave master del database viene usata per crittografare il segreto della credenziale con ambito database.
-- 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. Creare un'origine dati esterna per accedere ai dati in Archiviazione di Azure usando l'interfaccia wasb://
In questo esempio, l'origine dati esterna è un account di Archiviazione di Azure V2 denominato logs
. Il contenitore di archiviazione è denominato daily
. L'origine dati esterna di Archiviazione di Azure è destinata al solo trasferimento dei dati e non supporta il pushdown dei predicati. Gli spazi dei nomi gerarchici non sono supportati quando si accede ai dati tramite l'interfaccia wasb://
. Si noti che quando ci si connette ad Archiviazione di Azure tramite il connettore WASB[s], l'autenticazione deve essere eseguita con una chiave dell'account di archiviazione e non con una firma di accesso condiviso.
Questo esempio illustra come creare le credenziali con ambito di database per l'autenticazione in un account di Archiviazione di Azure V2. Specificare la chiave dell'account di Archiviazione di Azure nel segreto della credenziale di database. È possibile specificare qualsiasi stringa nell'identità della credenziale con ambito database perché non viene usata durante l'autenticazione in Archiviazione di Azure.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
SECRET = '<azure_storage_account_key>';
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
F. Creare un'origine dati esterna per fare riferimento a un'istanza denominata di SQL Server tramite la connettività PolyBase
Si applica a: SQL Server 2019 (15.x) e versioni successive
Per creare un'origine dati esterna che fa riferimento a un'istanza denominata di SQL Server, usare CONNECTION_OPTIONS
per specificare il nome dell'istanza.
Nell'esempio seguente è WINSQL2019
il nome host e SQL2019
è il nome dell'istanza. 'Server=%s\SQL2019'
è la coppia chiave-valore.
CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
LOCATION = 'sqlserver://WINSQL2019',
CONNECTION_OPTIONS = 'Server=%s\SQL2019',
CREDENTIAL = SQLServerCredentials
);
In alternativa, è possibile usare una porta per connettersi a un'istanza predefinita di SQL Server.
CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
LOCATION = 'sqlserver://WINSQL2019:58137',
CREDENTIAL = SQLServerCredentials
);
G. Creare un'origine dati esterna per fare riferimento a una replica secondaria leggibile del gruppo di disponibilità Always On
Si applica a: SQL Server 2019 (15.x) e versioni successive
Per creare un'origine dati esterna che fa riferimento a una replica secondaria leggibile di SQL Server, usare CONNECTION_OPTIONS
per specificare ApplicationIntent=ReadOnly
. Inoltre, sarà necessario impostare il database di disponibilità come Database={dbname}
in CONNECTION_OPTIONS
oppure impostare il database di disponibilità come database predefinito dell'account di accesso usato per le credenziali con ambito database. È necessario eseguire questa operazione in tutte le repliche di disponibilità del gruppo di disponibilità.
Prima di tutto, creare le credenziali con ambito database, archiviandole per un account di accesso con autenticazione SQL. Il connettore ODBC SQL per PolyBase supporta solo l'autenticazione di base. Prima di creare credenziali con ambito database, il database utente deve avere una chiave master per proteggerle. Per altre informazioni, vedere CREATE MASTER KEY. L'esempio seguente crea credenziali con ambito database. È necessario specificare account di accesso e password.
CREATE DATABASE SCOPED CREDENTIAL SQLServerCredentials
WITH IDENTITY = 'username',
SECRET = 'password';
Creare quindi la nuova origine dati esterna.
Indipendentemente dal fatto che sia stato incluso Database=dbname
nel CONNECTION_OPTIONS
database o impostato come database predefinito per l'account di accesso nella credenziale con ambito database, è comunque necessario specificare il nome del database tramite un nome in tre parti nell'istruzione CREATE EXTERNAL TABLE, all'interno del parametro LOCATION. Per un esempio, vedere CREATE EXTERNAL TABLE.
Nell'esempio seguente, WINSQL2019AGL
è il nome del listener del gruppo di disponibilità e dbname
è il nome del database come destinazione dell'istruzione CREATE EXTERNAL TABLE.
CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
LOCATION = 'sqlserver://WINSQL2019AGL',
CONNECTION_OPTIONS = 'ApplicationIntent=ReadOnly; Database=dbname',
CREDENTIAL = SQLServerCredentials
);
È possibile illustrare il comportamento di reindirizzamento del gruppo di disponibilità specificando ApplicationIntent
e creando una tabella esterna nella vista di sistema sys.servers
. Nello script di esempio seguente vengono create due origini dati esterne e una tabella esterna per ogni origine. Usare le viste per verificare quale server risponde alla connessione. È anche possibile ottenere risultati simili tramite la funzionalità di routing di sola lettura. Per altre informazioni, vedere Configurare il routing di sola lettura per un gruppo di disponibilità 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
All'interno del database nel gruppo di disponibilità creare una vista per restituire sys.servers
e il nome dell'istanza locale, che consente di identificare la replica che risponde alla query. Per altre informazioni, vedere sys.servers.
CREATE VIEW vw_sys_servers
AS
SELECT [name]
FROM sys.servers
WHERE server_id = 0;
GO
Creare quindi una tabella esterna nell'istanza di origine:
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
Esempi: operazioni bulk
Importante
Non aggiungere un carattere / finale, un nome file o parametri di firma per l'accesso condiviso alla fine dell'URL LOCATION
quando si configura un'origine dati esterne per le operazioni bulk.
H. Creare un'origine dati esterna per le operazioni bulk che recuperano i dati da Archiviazione di Azure
Si applica a: SQL Server 2017 (14.x) e SQL Server 2019 (15.x)
Usare l'origine dati seguente per le operazioni bulk che usano BULK INSERT o OPENROWSET. Le credenziali devono impostare SHARED ACCESS SIGNATURE
come identità, non devono includere il carattere ?
iniziale nel token di firma di accesso condiviso, devono avere almeno un'autorizzazione di lettura per il file da caricare (ad esempio srt=o&sp=r
). Inoltre il periodo di scadenza deve essere valido (tutte le date sono in formato UTC). Per altre informazioni sulle firme di accesso condiviso, vedere Uso delle firme di accesso condiviso.
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
);
Per un esempio pratico, vedere l'esempio di BULK INSERT.
I. Creare un'origine dati esterna per accedere ai dati in Archiviazione di Azure usando l'interfaccia abfs://
Si applica a: SQL Server 2019 (15.x) CU11 e versioni successive
In questo esempio l'origine dati esterna è un oggetto logs
di un account Azure Data Lake Storage Gen2, che usa il driver ABFS (Azure Blob File System). Il contenitore di archiviazione è denominato daily
. L'origine dati esterna Azure Data Lake Storage Gen2 serve solo per il trasferimento dei dati, in quanto il pushdown dei predicati non è supportato.
Questo esempio mostra come creare le credenziali con ambito database per l'autenticazione in un account Azure Data Lake Storage Gen2. Specificare la chiave dell'account di Archiviazione di Azure nel segreto della credenziale di database. È possibile specificare qualsiasi stringa nell'identità della credenziale con ambito database perché non viene usata durante l'autenticazione in Archiviazione di Azure.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
SECRET = '<azure_storage_account_key>';
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
LOCATION = 'abfss://daily@logs.dfs.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
J. Creare un'origine dati esterna usando ODBC generico in PostgreSQL
Come negli esempi precedenti, creare prima una chiave master del database e credenziali con ambito database. Le credenziali con ambito database verranno usate per l'origine dati esterna. In questo esempio si presuppone anche che nel server sia installato un provider di dati ODBC generico per PostgreSQL.
In questo esempio, il provider di dati ODBC generico viene usato per connettersi a un server di database PostgreSQL nella stessa rete, dove il nome di dominio completo del server PostgreSQL è POSTGRES1
, usando la porta predefinita tcp 5432.
CREATE EXTERNAL DATA SOURCE POSTGRES1
WITH (
LOCATION = 'odbc://POSTGRES1.domain:5432',
CONNECTION_OPTIONS = 'Driver={PostgreSQL Unicode(x64)};',
CREDENTIAL = postgres_credential
);
Passaggi successivi
Panoramica: SQL Server 2022
Si applica a: SQL Server 2022 (16.x) e versioni successive
Crea un'origine dati esterna per le query PolyBase. Le origini dati esterne vengono usate per stabilire la connettività e supportano questi casi d'uso principali:
- Virtualizzazione dati e caricamento dati con PolyBase
- Operazioni di caricamento bulk con
BULK INSERT
oOPENROWSET
Nota
Questa sintassi varia in base alla versione di SQL Server. Usare l'elenco a discesa di selezione della versione per scegliere la versione appropriata. Questo contenuto si applica a SQL Server 2022 (16.x) e versioni successive.
Sintassi per SQL Server 2022 e versioni successive
Per altre informazioni sulle convenzioni della sintassi, vedere Convenzioni della sintassi 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 } ]
)
[ ; ]
Argomenti
data_source_name
Specifica il nome definito dall'utente per l'origine dati. Il nome deve essere univoco all'interno del database in SQL Server.
LOCATION = '<prefix>://<path[:port]>'
Fornisce il protocollo di connettività e il percorso dell'origine dati esterna.
Origine dati esterna | Prefisso della posizione del connettore | Percorso | Posizioni supportate per prodotto/servizio | Autenticazione |
---|---|---|---|---|
account Archiviazione di Azure (V2) | abs |
abs://<container_name>@<storage_account_name>.blob.core.windows.net/ or abs://<storage_account_name>.blob.core.windows.net/<container_name> |
A partire da SQL Server 2022 (16.x) Lo spazio dei nomi gerarchico è supportato. |
Firma di accesso condiviso (SAS) |
Azure Data Lake Storage Gen2 | adls |
adls://<container_name>@<storage_account_name>.dfs.core.windows.net/ or adls://<storage_account_name>.dfs.core.windows.net/<container_name> |
A partire da SQL Server 2022 (16.x) | Firma di accesso condiviso (SAS) |
SQL Server | sqlserver |
<server_name>[\<instance_name>][:port] |
A partire da SQL Server 2019 (15.x) | Solo autenticazione SQL |
Oracle | oracle |
<server_name>[:port] |
A partire da SQL Server 2019 (15.x) | Solo autenticazione di base |
Teradata | teradata |
<server_name>[:port] |
A partire da SQL Server 2019 (15.x) | Solo autenticazione di base |
MongoDB o API Cosmos DB per MongoDB | mongodb |
<server_name>[:port] |
A partire da SQL Server 2019 (15.x) | Solo autenticazione di base |
ODBC generico | odbc |
<server_name>[:port] |
A partire da SQL Server 2019 (15.x) - Solo Windows | Solo autenticazione di base |
Operazioni bulk | https |
<storage_account>.blob.core.windows.net/<container> |
A partire da SQL Server 2017 (14.x) | Firma di accesso condiviso (SAS) |
Risorsa di archiviazione di oggetti compatibile con S3 | s3 |
- Compatibile 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 partire da SQL Server 2022 (16.x) | Basic o pass-through (STS) * |
* Deve essere una credenziale con ambito database, in cui identity è hardcoded per IDENTITY = 'S3 Access Key'
e l'argomento SECRET è nel formato = '<AccessKeyID>:<SecretKeyID>'
o usare l'autorizzazione pass-through (STS). Per altre informazioni, vedere Configurare PolyBase per accedere ai dati esterni nell'archiviazione oggetti compatibile con S3.
Percorso:
port
= porta su cui è in ascolto l'origine dati esterna. Facoltativo in molti casi, a seconda della configurazione di rete.<container_name>
= contenitore dell'account di archiviazione che include i dati. I contenitori radice sono di sola lettura, di conseguenza i dati non possono essere riscritti nel contenitore.<storage_account>
= nome dell'account di archiviazione della risorsa di Azure.<server_name>
= nome host.<instance_name>
= nome dell'istanza denominata di SQL Server. Usato se il servizio SQL Server Browser Service è in esecuzione nell'istanza di destinazione.<ip_address>:<port>
= Solo per l'archiviazione oggetti compatibile con S3 (a partire da SQL Server 2022 (16.x)), l'endpoint e la porta usati per connettersi all'archiviazione compatibile con S3.<bucket_name>
= Solo per l'archiviazione di oggetti compatibile con S3 (a partire da SQL Server 2022 (16.x)), specifica della piattaforma di archiviazione.<region>
= Solo per l'archiviazione di oggetti compatibile con S3 (a partire da SQL Server 2022 (16.x)), specifica della piattaforma di archiviazione.<folder>
= Parte del percorso di archiviazione all'interno dell'URL di archiviazione.
Note aggiuntive e indicazioni utili per l'impostazione della posizione:
- Il motore di database di SQL Server non verifica l'esistenza dell'origine dati esterna quando viene creato l'oggetto. Per eseguire la convalida, creare una tabella esterna usando l'origine dati esterna.
- È possibile usare il
sqlserver
connettore per connettere SQL Server 2019 (15.x) a un altro SQL Server o a database SQL di Azure. - Per la connessione tramite
ODBC
specificareDriver={<Name of Driver>}
. - L'opzione Spazio dei nomi gerarchico per Archiviazione di Azure Accounts(V2) con il prefisso
adls
è supportata tramite Azure Data Lake Storage Gen2 in SQL Server 2022 (16.x).
- Il supporto di SQL Server per le origini dati esterne HDFS Cloudera (CDP) e Hortonworks (HDP) viene ritirato e non incluso in SQL Server 2022 (16.x). Non è necessario usare l'argomento TYPE in SQL Server 2022 (16.x).
- Per altre informazioni sull'archiviazione di oggetti compatibile con S3 e PolyBase a partire da SQL Server 2022 (16.x), vedere Configurare PolyBase per accedere ai dati esterni nell'archiviazione oggetti compatibile con S3. Per un esempio di esecuzione di query su un file Parquet in una risorsa di archiviazione di oggetti compatibile con S3, vedere Virtualizzare un file Parquet in una risorsa di archiviazione di oggetti compatibile con S3 con PolyBase.
- Diversa dalle versioni precedenti, in SQL Server 2022 (16.x), il prefisso usato per Archiviazione di Azure Account (v2) è cambiato da
wasb[s]
aabs
. - Diversa dalle versioni precedenti, in SQL Server 2022 (16.x), il prefisso usato per Azure Data Lake Storage Gen2 è cambiato da
abfs[s]
aadls
. - Per un esempio di uso di PolyBase per virtualizzare un file CSV in Archiviazione di Azure, vedere Virtualizzare un file CSV con PolyBase.
- Per un esempio che usa PolyBase per virtualizzare una tabella delta in ADLS Gen2, vedere Virtualizzare una tabella delta con PolyBase.
- SQL Server 2022 (16.x) supporta completamente due formati URL sia per Archiviazione di Azure Account v2 (
abs
) che per Azure Data Lake Gen2 (adls
).- Il percorso LOCATION può usare i formati:
<container>@<storage_account_name>..
(scelta consigliata) o<storage_account_name>../<container>
. Ad esempio:- Archiviazione di Azure Account v2:
abs://<container>@<storage_account_name>.blob.core.windows.net
(scelta consigliata) oabs://<storage_account_name>.blob.core.windows.net/<container>
. - Azure Data Lake Gen2 supporta:
adls://<container>@<storage_account_name>.blob.core.windows.net
(scelta consigliata) oadls://<storage_account_name>.dfs.core.windows.net/<container>
.
- Archiviazione di Azure Account v2:
- Il percorso LOCATION può usare i formati:
CONNECTION_OPTIONS = key_value_pair
Per SQL Server 2019 (15.x) e versioni successive. Specifica le opzioni aggiuntive quando si esegue la connessione a un'origine dati esterna tramite ODBC
. Per usare più opzioni di connessione, separarle con un punto e virgola.
Si applica alle connessioni ODBC
generiche, nonché ai connettori ODBC
predefiniti per SQL Server, Oracle, Teradata, MongoDB e l'API Azure Cosmos DB per MongoDB.
key_value_pair
rappresenta la parola chiave e il valore per un'opzione di connessione specifica. Le parole chiave e i valori disponibili dipendono dal tipo di origine dati esterna. Il nome del driver è un requisito minimo, ma sono disponibili altre opzioni, ad esempio APP='<your_application_name>'
o ApplicationIntent= ReadOnly|ReadWrite
, che può essere utile impostare e possono essere usate per la risoluzione dei problemi.
Le possibili coppie chiave-valore sono specifiche del driver. Per altre informazioni su ogni provider, vedere CREATE EXTERNAL DATA SOURCE (Transact-SQL) CONNECTION_OPTIONS.
A partire da Si applica a: SQL Server 2022 (16.x) aggiornamento cumulativo 2, sono state introdotte parole chiave aggiuntive per supportare i file Oracle TNS:
- La parola chiave
TNSNamesFile
specifica il percorso file deltnsnames.ora
file che si trova nel server Oracle. - La parola chiave
ServerName
specifica l'alias usato all'interno ditnsnames.ora
che verrà usato per sostituire il nome host e la porta.
PUSHDOWN = ON | OFF
Si applica a: SQL Server 2019 (15.x) e versioni successive. Indica se è possibile eseguire il pushdown del calcolo nell'origine dati esterna. È attivato per impostazione predefinita.
PUSHDOWN
è supportato per la connessione a SQL Server, Oracle, Teradata, MongoDB, l'API Azure Cosmos BDB per MongoDB o ODBC a livello di origine dati esterna.
Per abilitare o disabilitare il pushdown a livello di query, si usa un hint.
CREDENTIAL = credential_name
Specifica una credenziale con ambito database per l'autenticazione nell'origine dati esterna.
Note aggiuntive e indicazioni utili per la creazione delle credenziali:
CREDENTIAL
è obbligatorio solo se i dati sono stati protetti.CREDENTIAL
non è obbligatorio per i set di dati che consentono l'accesso anonimo.- Quando si accede all'account Archiviazione di Azure (V2) o Azure Data Lake Storage Gen2, deve
IDENTITY
essereSHARED ACCESS SIGNATURE
.
Esistono diversi modi per creare una firma di accesso condiviso:
È possibile creare un token di firma di accesso condiviso passando alla portale di Azure -><Your_Storage_Account> - Firma di accesso condiviso -> Configurare le autorizzazioni ->> Generare firma di accesso condiviso e stringa di connessione. Per altre informazioni, vedere Generare una firma di accesso condiviso.
È possibile creare e configurare una firma di accesso condiviso con Archiviazione di Azure Explorer.
È possibile creare una firma di accesso condiviso a livello di codice tramite PowerShell, l'interfaccia della riga di comando di Azure, .NET e l'API REST. Per altre informazioni, vedere Concedere accesso limitato alle risorse di Archiviazione di Azure tramite firme di accesso condiviso.
Il token di firma di accesso condiviso deve essere configurato come segue:
- Quando viene generato, il token di firma di accesso condiviso è preceduto da un punto interrogativo ('?'). Escludere l'elemento iniziale
?
quando configurato come SECRET. - Usare un periodo di scadenza valido (tutte le date sono espresse in formato UTC).
- Concedere almeno l'autorizzazione di lettura per il file che deve essere caricato ( ad esempio
srt=o&sp=r
). È possibile creare più firme di accesso condiviso per casi d'uso diversi. Le autorizzazioni devono essere concesse come segue:
Azione Autorizzazione Lettura di dati da un file Lettura Leggere i dati da più file e sottocartelle Lettura e Lista Usare Create External Table as Select (CETAS) Lettura, creazione, elenco e scrittura - Quando viene generato, il token di firma di accesso condiviso è preceduto da un punto interrogativo ('?'). Escludere l'elemento iniziale
Per Archiviazione BLOB di Azure e Azure Data Lake Gen 2:
- Servizi consentiti:
Blob
deve essere selezionato per generare il token di firma di accesso condiviso - Tipi di risorse consentiti:
Container
eObject
devono essere selezionati per generare il token di firma di accesso condiviso
- Servizi consentiti:
Per un esempio d'uso di un oggetto CREDENTIAL
con una risorsa di archiviazione di oggetti compatibile con S3 e PolyBase, vedere Configurare PolyBase per l'accesso ai dati esterni in una risorsa di archiviazione di oggetti compatibile con S3.
Per creare credenziali con ambito database, vedere CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL).
Autorizzazioni
Richiede l'autorizzazione CONTROL
nel database in SQL Server.
Blocco
Acquisisce un blocco condiviso per l'oggetto EXTERNAL DATA SOURCE
.
Sicurezza
PolyBase supporta l'autenticazione basata su proxy per la maggior parte delle origini dati esterne. Creare credenziali con ambito database per creare l'account proxy.
Aggiornare a SQL Server 2022
A partire da SQL Server 2022 (16.x), le origini dati esterne Hadoop non sono più supportate. È necessario ricreare manualmente origini dati esterne create in precedenza con TYPE = HADOOP
e qualsiasi tabella esterna che usa questa origine dati esterna.
Gli utenti dovranno anche configurare le proprie origini dati esterne per l'uso di nuovi connettori durante la connessione ad Archiviazione di Azure.
Origine dati esterna | Da | Per |
---|---|---|
Archiviazione BLOB di Azure | wasb[s] | abs |
ADLS Gen2 | abfs[s] | adls |
Esempi
Importante
Per informazioni su come installare e abilitare PolyBase, vedere Installare PolyBase in Windows
R. Creare un'origine dati esterna in SQL Server per fare riferimento a Oracle
Per creare un'origine dati esterna che fa riferimento a Oracle, assicurarsi di disporre di credenziali con ambito database. È anche possibile abilitare o disabilitare il pushdown del calcolo su questa origine dati.
-- 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
);
Facoltativamente, l'origine dati esterna a Oracle può usare l'autenticazione proxy per fornire un controllo di accesso con granularità fine. Un utente proxy può essere configurato in modo che abbia accesso limitato rispetto all'utente rappresentato.
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]
);
In alternativa, è possibile eseguire l'autenticazione tramite TNS.
A partire da Si applica a: SQL Server 2022 (16.x) Aggiornamento cumulativo 2, CREATE EXTERNAL DATA SOURCE
supporta ora l'uso di file TNS durante la connessione a Oracle.
Il CONNECTION_OPTIONS
parametro è stato espanso e ora usa TNSNamesFile
e ServerName
come variabili per esplorare il tnsnames.ora
file e stabilire la connessione con il server.
Nell'esempio seguente, durante il runtime SQL Server cercherà il percorso del tnsnames.ora
file specificato da TNSNamesFile
e cercherà l'host e la porta di rete specificata da 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. Creare un'origine dati esterna per fare riferimento a un'istanza denominata di SQL Server tramite la connettività PolyBase
Si applica a: SQL Server 2019 (15.x) e versioni successive
Per creare un'origine dati esterna che fa riferimento a un'istanza denominata di SQL Server, usare CONNECTION_OPTIONS
per specificare il nome dell'istanza.
Prima di tutto, creare le credenziali con ambito database, archiviandole per un account di accesso con autenticazione SQL. Il connettore ODBC SQL per PolyBase supporta solo l'autenticazione di base. Prima di creare credenziali con ambito database, il database utente deve avere una chiave master per proteggerle. Per altre informazioni, vedere CREATE MASTER KEY. L'esempio seguente crea credenziali con ambito database. È necessario specificare account di accesso e password.
CREATE DATABASE SCOPED CREDENTIAL SQLServerCredentials
WITH IDENTITY = 'username',
SECRET = 'password';
Nell'esempio seguente è WINSQL2019
il nome host e SQL2019
è il nome dell'istanza. 'Server=%s\SQL2019'
è la coppia chiave-valore.
CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
LOCATION = 'sqlserver://WINSQL2019',
CONNECTION_OPTIONS = 'Server=%s\SQL2019',
CREDENTIAL = SQLServerCredentials
);
In alternativa, è possibile usare una porta per connettersi a un'istanza predefinita di SQL Server.
CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
LOCATION = 'sqlserver://WINSQL2019:58137',
CREDENTIAL = SQLServerCredentials
);
C. Creare un'origine dati esterna per fare riferimento a una replica secondaria leggibile del gruppo di disponibilità Always On
Si applica a: SQL Server 2019 (15.x) e versioni successive
Per creare un'origine dati esterna che fa riferimento a una replica secondaria leggibile di SQL Server, usare CONNECTION_OPTIONS
per specificare ApplicationIntent=ReadOnly
. Inoltre, sarà necessario impostare il database di disponibilità come Database={dbname}
in CONNECTION_OPTIONS
oppure impostare il database di disponibilità come database predefinito dell'account di accesso usato per le credenziali con ambito database. È necessario eseguire questa operazione in tutte le repliche di disponibilità del gruppo di disponibilità.
Prima di tutto, creare le credenziali con ambito database, archiviandole per un account di accesso con autenticazione SQL. Il connettore ODBC SQL per PolyBase supporta solo l'autenticazione di base. Prima di creare credenziali con ambito database, il database utente deve avere una chiave master per proteggerle. Per altre informazioni, vedere CREATE MASTER KEY. L'esempio seguente crea credenziali con ambito database. È necessario specificare account di accesso e password.
CREATE DATABASE SCOPED CREDENTIAL SQLServerCredentials
WITH IDENTITY = 'username',
SECRET = 'password';
Creare quindi la nuova origine dati esterna.
Indipendentemente dal fatto che sia stato incluso Database=dbname
nel CONNECTION_OPTIONS
database o impostato come database predefinito per l'account di accesso nella credenziale con ambito database, è comunque necessario specificare il nome del database tramite un nome in tre parti nell'istruzione CREATE EXTERNAL TABLE, all'interno del parametro LOCATION. Per un esempio, vedere CREATE EXTERNAL TABLE.
Nell'esempio seguente, WINSQL2019AGL
è il nome del listener del gruppo di disponibilità e dbname
è il nome del database come destinazione dell'istruzione CREATE EXTERNAL TABLE.
CREATE EXTERNAL DATA SOURCE SQLServerInstance2
WITH (
LOCATION = 'sqlserver://WINSQL2019AGL',
CONNECTION_OPTIONS = 'ApplicationIntent=ReadOnly; Database=dbname',
CREDENTIAL = SQLServerCredentials
);
È possibile illustrare il comportamento di reindirizzamento del gruppo di disponibilità specificando ApplicationIntent
e creando una tabella esterna nella vista di sistema sys.servers
. Nello script di esempio seguente vengono create due origini dati esterne e una tabella esterna per ogni origine. Usare le viste per verificare quale server risponde alla connessione. È anche possibile ottenere risultati simili tramite la funzionalità di routing di sola lettura. Per altre informazioni, vedere Configurare il routing di sola lettura per un gruppo di disponibilità 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
All'interno del database nel gruppo di disponibilità creare una vista per restituire sys.servers
e il nome dell'istanza locale, che consente di identificare la replica che risponde alla query. Per altre informazioni, vedere sys.servers.
CREATE VIEW vw_sys_servers
AS
SELECT [name]
FROM sys.servers
WHERE server_id = 0;
GO
Creare quindi una tabella esterna nell'istanza di origine:
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. Creare un'origine dati esterna per eseguire query su un file Parquet in una risorsa di archiviazione di oggetti compatibile con S3 tramite PolyBase
Si applica a: SQL Server 2022 (16.x) e versioni successive
Lo script di esempio seguente crea un'origine dati esterna s3_ds
nel database utente di origine in SQL Server. L'origine dati esterna fa riferimento alle credenziali con ambito database di 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
Verificare la nuova origine dati esterna con sys.external_data_sources.
SELECT * FROM sys.external_data_sources;
L'esempio seguente illustra quindi l'uso di T-SQL per eseguire query su un file Parquet archiviato nell'archiviazione oggetti compatibile con S3 tramite la query OPENROWSET. Per altre informazioni, vedere Virtualizzare un file Parquet in una risorsa di archiviazione di oggetti compatibile con S3 con PolyBase.
SELECT *
FROM OPENROWSET (
BULK '/<bucket>/<parquet_folder>',
FORMAT = 'PARQUET',
DATA_SOURCE = 's3_ds'
) AS [cc];
E. Creare un'origine dati esterna usando ODBC generico in PostgreSQL
Come negli esempi precedenti, creare prima una chiave master del database e credenziali con ambito database. Le credenziali con ambito database verranno usate per l'origine dati esterna. In questo esempio si presuppone anche che nel server sia installato un provider di dati ODBC generico per PostgreSQL.
In questo esempio, il provider di dati ODBC generico viene usato per connettersi a un server di database PostgreSQL nella stessa rete, dove il nome di dominio completo del server PostgreSQL è POSTGRES1
, usando la porta predefinita tcp 5432.
CREATE EXTERNAL DATA SOURCE POSTGRES1
WITH (
LOCATION = 'odbc://POSTGRES1.domain:5432',
CONNECTION_OPTIONS = 'Driver={PostgreSQL Unicode(x64)};',
CREDENTIAL = postgres_credential
);
Archiviazione di Azure
Creare una firma di accesso condiviso
Sia per Archiviazione BLOB di Azure che per Azure Data Lake Gen2, il metodo di autenticazione supportato è la firma di accesso condiviso (SAS). Un modo semplice per generare un token di firma di accesso condiviso seguire la procedura seguente. Per altre informazioni, vedere CREDENTIAL.
- Passare alla portale di Azure e all'account di archiviazione desiderato.
- Passare al contenitore desiderato nel menu Archiviazione dati.
- Selezionare Token di accesso condiviso.
- Scegliere l'autorizzazione appropriata in base all'azione desiderata, per riferimento usare la tabella seguente:
Azione | Autorizzazione |
---|---|
Lettura di dati da un file | Lettura |
Leggere i dati da più file e sottocartelle | Lettura e Lista |
Usare Create External Table as Select (CETAS) | Lettura, creazione e scrittura |
- Scegliere la data di scadenza del token.
- Generare il token di firma di accesso condiviso e l'URL.
- Copiare il token di firma di accesso condiviso.
F. Creare un'origine dati esterna per accedere ai dati in Archiviazione BLOB di Azure usando l'interfaccia abs://
Si applica a: SQL Server 2022 (16.x) e versioni successive
A partire da SQL Server 2022 (16.x), usare un nuovo prefisso abs
per Archiviazione di Azure Account v2. Il abs
prefisso supporta l'autenticazione tramite SHARED ACCESS SIGNATURE
. Il abs
prefisso sostituisce wasb
, usato nelle versioni precedenti. HADOOP non è più supportato, non è più necessario usare TYPE = BLOB_STORAGE
.
La chiave dell'account di archiviazione di Azure non è più necessaria, ma usando il token di firma di accesso condiviso, come illustrato nell'esempio seguente:
-- 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,
);
Per un esempio più dettagliato su come accedere ai file CSV archiviati in Archiviazione BLOB di Azure, vedere Virtualizzare il file CSV con PolyBase.
G. Creare un'origine dati esterna per accedere ai dati in Azure Data Lake Gen2
Si applica a: SQL Server 2022 (16.x) e versioni successive
A partire da SQL Server 2022 (16.x), usare un nuovo prefisso adls
per Azure Data Lake Gen2, sostituendo abfs
usato nelle versioni precedenti. Il prefisso supporta anche il adls
token di firma di accesso condiviso come metodo di autenticazione, come illustrato in questo esempio:
--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
);
Per un esempio più dettagliato su come accedere ai file differenziali archiviati in Azure Data Lake Gen2, vedere Virtualizzare la tabella delta con PolyBase.
Esempi: operazioni bulk
Importante
Non aggiungere un carattere / finale, un nome file o parametri di firma per l'accesso condiviso alla fine dell'URL LOCATION
quando si configura un'origine dati esterne per le operazioni bulk.
H. Creare un'origine dati esterna per le operazioni bulk che recuperano i dati da Archiviazione di Azure
Si applica a: SQL Server 2022 (16.x) e versioni successive.
Usare l'origine dati seguente per le operazioni bulk che usano BULK INSERT o OPENROWSET. Le credenziali devono impostare SHARED ACCESS SIGNATURE
come identità, non devono includere il carattere ?
iniziale nel token di firma di accesso condiviso, devono avere almeno un'autorizzazione di lettura per il file da caricare (ad esempio srt=o&sp=r
). Inoltre il periodo di scadenza deve essere valido (tutte le date sono in formato UTC). Per altre informazioni sulle firme di accesso condiviso, vedere Uso delle firme di accesso condiviso.
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,
);
Passaggi successivi
* Database SQL *
Panoramica: database SQL di Azure
Si applica a: Database SQL di Azure
Crea un'origine dati esterna per le query elastiche. Le origini dati esterne vengono usate per stabilire la connettività e supportano questi casi d'uso principali:
- Operazioni di caricamento bulk con
BULK INSERT
oOPENROWSET
- Esecuzione di query su istanze remote del database SQL o di Azure Synapse con il database SQL con query elastica
- Esecuzione di query su un database SQL partizionato usando una query elastica
Sintassi
Per altre informazioni sulle convenzioni della sintassi, vedere Convenzioni della sintassi 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>' ] )
[ ; ]
Argomenti
data_source_name
Specifica il nome definito dall'utente per l'origine dati. Il nome deve essere univoco all'interno del database nel database SQL.
LOCATION = '<prefix>://<path[:port]>'
Fornisce il protocollo di connettività e il percorso dell'origine dati esterna.
Origine dati esterna | Prefisso della posizione del connettore | Percorso | Disponibilità |
---|---|---|---|
Operazioni bulk | https |
<storage_account>.blob.core.windows.net/<container> |
|
Query elastica (partizione) | Non obbligatorio | <shard_map_server_name>.database.windows.net |
|
Query elastica (remoto) | Non obbligatorio | <remote_server_name>.database.windows.net |
|
EdgeHub | edgehub |
edgehub:// |
Disponibile solo in SQL Edge di Azure. EdgeHub è sempre locale nell'istanza di SQL Edge di Azure. Non è necessario, quindi, specificare un percorso o un valore di porta. |
Kafka | kafka |
kafka://<kafka_bootstrap_server_name_ip>:<port_number> |
Disponibile solo in SQL Edge di Azure. |
Percorso:
<shard_map_server_name>
= nome del server logico in Azure che ospita il gestore mappe partizioni. L'argomentoDATABASE_NAME
fornisce il database usato per ospitare la mappa partizioni, mentreSHARD_MAP_NAME
viene usato per la mappa partizioni stessa.<remote_server_name>
= nome del server logico di destinazione per la query elastica. Per specificare il nome del database, si usa l'argomentoDATABASE_NAME
.
Note aggiuntive e indicazioni utili per l'impostazione della posizione:
- Il motore di database non verifica l'esistenza dell'origine dati esterna quando viene creato l'oggetto. Per eseguire la convalida, creare una tabella esterna usando l'origine dati esterna.
CREDENTIAL = credential_name
Specifica una credenziale con ambito database per l'autenticazione nell'origine dati esterna.
Note aggiuntive e indicazioni utili per la creazione delle credenziali:
- Per caricare i dati da Archiviazione di Azure nel database SQL di Azure, usare una firma di accesso condiviso (token di firma di accesso condiviso).
CREDENTIAL
è obbligatorio solo se i dati sono stati protetti.CREDENTIAL
non è obbligatorio per i set di dati che consentono l'accesso anonimo.- Quando
TYPE
=BLOB_STORAGE
, è necessario creare le credenziali usandoSHARED ACCESS SIGNATURE
come identità. - Quando ci si connette al Archiviazione di Azure tramite il connettore WASB[s], l'autenticazione deve essere eseguita con una chiave dell'account di archiviazione, non con una firma di accesso condiviso.When connecting to the Archiviazione di Azure via the WASB[s] connector, authentication must be done with a storage account key, not with a shared access signature (SAS).
- Quando
TYPE
=HADOOP
è necessario creare le credenziali usando la chiave dell'account di archiviazione comeSECRET
. TYPE
=BLOB_STORAGE
si può usare solo per le operazioni bulk e non è possibile creare tabelle esterne per un'origine dati esterna conTYPE
=BLOB_STORAGE
.
Esistono diversi modi per creare una firma di accesso condiviso:
È possibile creare un token di firma di accesso condiviso passando alla portale di Azure -><Your_Storage_Account> - Firma di accesso condiviso -> Configurare le autorizzazioni ->> Generare firma di accesso condiviso e stringa di connessione. Per altre informazioni, vedere Generare una firma di accesso condiviso.
È possibile creare e configurare una firma di accesso condiviso con Archiviazione di Azure Explorer.
È possibile creare una firma di accesso condiviso a livello di codice tramite PowerShell, l'interfaccia della riga di comando di Azure, .NET e l'API REST. Per altre informazioni, vedere Concedere accesso limitato alle risorse di Archiviazione di Azure tramite firme di accesso condiviso.
Il token di firma di accesso condiviso deve essere configurato come segue:
- Quando viene generato, il token di firma di accesso condiviso è preceduto da un punto interrogativo ('?'). Escludere l'elemento iniziale
?
quando configurato come SECRET. - Usare un periodo di scadenza valido (tutte le date sono espresse in formato UTC).
- Concedere almeno l'autorizzazione di lettura per il file che deve essere caricato ( ad esempio
srt=o&sp=r
). È possibile creare più firme di accesso condiviso per casi d'uso diversi. Le autorizzazioni devono essere concesse come segue:
Azione Autorizzazione Lettura di dati da un file Lettura Leggere i dati da più file e sottocartelle Lettura e Lista Usare Create External Table as Select (CETAS) Lettura, creazione e scrittura - Quando viene generato, il token di firma di accesso condiviso è preceduto da un punto interrogativo ('?'). Escludere l'elemento iniziale
Per un esempio d'uso di CREDENTIAL
con SHARED ACCESS SIGNATURE
e TYPE
= BLOB_STORAGE
, vedere Creare un'origine dati esterna per eseguire operazioni bulk e recuperare dati da Archiviazione di Azure nel database SQL
Per creare credenziali con ambito database, vedere CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL).
TYPE = [ BLOB_STORAGE | RDBMS | SHARD_MAP_MANAGER]
Specifica il tipo dell'origine dati esterna da configurare. Questo parametro non è sempre obbligatorio.
- Usare
RDBMS
per le query tra database usando una query elastica dal database SQL. - Usare
SHARD_MAP_MANAGER
durante la creazione di un'origine dati esterna per la connessione a un database SQL partizionato. - Usare
BLOB_STORAGE
durante l'esecuzione di operazioni bulk con BULK INSERT o OPENROWSET.
Importante
Non impostare TYPE
se si usa qualsiasi altra origine dati esterna.
DATABASE_NAME = database_name
Configurare questo argomento quando TYPE
è impostato su RDBMS
o SHARD_MAP_MANAGER
.
TIPO | Valore di DATABASE_NAME |
---|---|
RDBMS | Nome del database remoto sul server specificando usando LOCATION |
SHARD_MAP_MANAGER | Nome del database che funge da gestore mappe partizioni |
Per un esempio relativo alla creazione di un'origine dati esterna in cui TYPE
= RDBMS
, vedere Creare un'origine dati esterna RDBMS
SHARD_MAP_NAME = shard_map_name
Usato quando l'argomento TYPE
è impostato su SHARD_MAP_MANAGER
solo per impostare il nome della mappa partizioni.
Per un esempio relativo alla creazione di un'origine dati esterna in cui TYPE
= SHARD_MAP_MANAGER
, vedere Creare un'origine dati esterna del gestore mappe partizioni
Autorizzazioni
Richiede l'autorizzazione CONTROL
per il database nel database SQL di Azure.
Blocco
Acquisisce un blocco condiviso per l'oggetto EXTERNAL DATA SOURCE
.
Esempi
R. Creare un'origine dati esterna del gestore mappe partizioni
Per creare un'origine dati esterna per fare riferimento a SHARD_MAP_MANAGER
e specificare il nome del server di database SQL che ospita il gestore mappe partizioni nel database SQL o un database di SQL Server in una macchina virtuale.
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'
);
Per un'esercitazione dettagliata, vedere Introduzione alle query di database elastico per il partizionamento orizzontale.
B. Creare un'origine dati esterna RDBMS
Per creare un'origine dati esterna per fare riferimento a un RDBMS, specificare il nome del server di database SQL del database remoto nel database SQL.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
CREATE DATABASE SCOPED CREDENTIAL SQL_Credential
WITH IDENTITY = '<username>',
SECRET = '<password>';
CREATE EXTERNAL DATA SOURCE MyElasticDBQueryDataSrc
WITH (
TYPE = RDBMS,
LOCATION = '<server_name>.database.windows.net',
DATABASE_NAME = 'Customers',
CREDENTIAL = SQL_Credential
);
Per un'esercitazione dettagliata su RDBMS, vedere Introduzione alle query tra database (partizionamento verticale).
Esempi: operazioni bulk
Importante
Non aggiungere un carattere / finale, un nome file o parametri di firma per l'accesso condiviso alla fine dell'URL LOCATION
quando si configura un'origine dati esterne per le operazioni bulk.
C. Creare un'origine dati esterna per le operazioni bulk che recuperano i dati da Archiviazione di Azure
Usare l'origine dati seguente per le operazioni bulk che usano BULK INSERT o OPENROWSET. Le credenziali devono impostare SHARED ACCESS SIGNATURE
come identità, non devono includere il carattere ?
iniziale nel token di firma di accesso condiviso, devono avere almeno un'autorizzazione di lettura per il file da caricare (ad esempio srt=o&sp=r
). Inoltre il periodo di scadenza deve essere valido (tutte le date sono in formato UTC). Per altre informazioni sulle firme di accesso condiviso, vedere Uso delle firme di accesso condiviso.
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
);
Per un esempio di utilizzo, vedere BULK INSERT.
Esempi: SQL Edge di Azure
Importante
Per informazioni sulla configurazione dei dati esterni per SQL Edge di Azure, vedere Flusso di dati in SQL Edge di Azure.
R. Creare un'origine dati esterna per fare riferimento a Kafka
Si applica a: solo SQL Edge di Azure
In questo esempio l'origine dati esterna è un server Kafka con indirizzo IP xxx.xxx.xxx.xxx e in ascolto sulla porta 1900. L'origine dati esterna Kafka viene usata solo per lo streaming dei dati e non supporta il pushdown di predicati.
-- Create an External Data Source for Kafka
CREATE EXTERNAL DATA SOURCE MyKafkaServer
WITH (LOCATION = 'kafka://xxx.xxx.xxx.xxx:1900');
B. Creare un'origine dati esterna per fare riferimento a EdgeHub
Si applica a: solo SQL Edge di Azure
In questo esempio, l'origine dati esterna è un EdgeHub in esecuzione nello stesso dispositivo perimetrale di SQL Edge di Azure. L'origine dati esterna EdgeHub viene usata solo per lo streaming dei dati e non supporta la distribuzione dei predicati.
-- Create an External Data Source for Kafka
CREATE EXTERNAL DATA SOURCE MyEdgeHub
WITH (LOCATION = 'edgehub://');
Passaggi successivi
* Azure Synapse
Analytics *
Panoramica: Azure Synapse Analytics
Si applica a: Azure Synapse Analytics
Crea un'origine dati esterna per la virtualizzazione dei dati. Le origini dati esterne vengono usate per stabilire la connettività e supportare il caso d'uso principale della virtualizzazione dei dati e del caricamento dei dati da origini dati esterne. Per altre informazioni, consultare Usare tabelle esterne con Synapse SQL.
Importante
Per creare un'origine dati esterna per l'esecuzione di query su una risorsa di Azure Synapse Analytics che usa il database SQL di Azure con query elastica, vedere Database SQL.
Sintassi
Per altre informazioni sulle convenzioni della sintassi, vedere Convenzioni della sintassi Transact-SQL.
CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
( [ LOCATION = '<prefix>://<path>[:<port>]' ]
[ [ , ] CREDENTIAL = <credential_name> ]
[ [ , ] TYPE = HADOOP ]
)
[ ; ]
Argomenti
data_source_name
Specifica il nome definito dall'utente per l'origine dati. Il nome deve essere univoco all'interno del database SQL di Azure in Azure Synapse Analytics.
LOCATION = '<prefix>://<path>'
Fornisce il protocollo di connettività e il percorso dell'origine dati esterna.
Origine dati esterna | Prefisso della posizione del connettore | Percorso |
---|---|---|
Data Lake Storage* Gen1 | adl |
<storage_account>.azuredatalake.net |
Data Lake Storage Gen2 | abfs[s] |
<container>@<storage_account>.dfs.core.windows.net |
Archiviazione BLOB di Azure | wasbs |
<container>@<storage_account>.blob.core.windows.net |
Archiviazione BLOB di Azure | 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 ha un supporto limitato, è consigliabile gen2 per tutti i nuovi sviluppi.
Origine dati esterna | Prefisso della posizione del connettore | Pool SQL dedicati: PolyBase | Pool SQL dedicati: native* | Pool SQL serverless |
---|---|---|---|---|
Data Lake Storage** Gen1 | adl |
No | No | Sì |
Data Lake Storage Gen2 | abfs[s] |
Sì | Sì | Sì |
Spazio di Archiviazione BLOB di Azure | wasbs |
Sì | Sì*** | Sì |
Spazio di Archiviazione BLOB di Azure | https |
No | Sì | Sì |
Data Lake Storage Gen1 | http[s] |
No | No | Sì |
Data Lake Storage Gen2 | http[s] |
Sì | Sì | Sì |
Data Lake Storage Gen2 | wasb[s] |
Sì | Sì | Sì |
* Pool SQL serverless e dedicati in Azure Synapse Analytics usano codebase diversi per la virtualizzazione dei dati. I pool SQL serverless supportano una tecnologia di virtualizzazione dei dati nativa. I pool SQL dedicati supportano la virtualizzazione dei dati nativa e PolyBase. La virtualizzazione dei dati PolyBase viene usata quando si crea EXTERNAL DATA SOURCE con TYPE=HADOOP
.
** Microsoft Azure Data Lake Storage Gen1 ha un supporto limitato, è consigliabile gen2 per tutti i nuovi sviluppi.
Il connettore più sicuro wasbs
è consigliato su wasb
. Solo la virtualizzazione dei dati nativa nei pool SQL dedicati (in cui TYPE non è uguale a HADOOP) supporta wasb
.
Percorso:
<container>
= contenitore dell'account di archiviazione che include i dati. I contenitori radice sono di sola lettura, di conseguenza i dati non possono essere riscritti nel contenitore.<storage_account>
= nome dell'account di archiviazione della risorsa di Azure.
Note aggiuntive e indicazioni utili per l'impostazione della posizione:
- L'opzione predefinita consiste nell'usare
enable secure SSL connections
quando si effettua il provisioning di Azure Data Lake Storage Gen2. Quando questa opzione è abilitata, è necessario usareabfss
quando viene selezionata una connessione TLS/SSL protetta. Si noti cheabfss
funziona anche per le connessioni TLS non sicure. Per altre informazioni, vedere Driver ABFS (Azure Blob File System). - Azure Synapse non verifica l'esistenza dell'origine dati esterna quando viene creato l'oggetto. Per eseguire la convalida, creare una tabella esterna usando l'origine dati esterna.
- Per garantire una semantica di esecuzione di query coerente, usare la stessa origine dati esterna per tutte le tabelle quando si eseguono query su Hadoop.
- Il prefisso
https:
consente di usare la sottocartella nel percorso.https
non è disponibile per tutti i metodi di accesso ai dati. wasbs
è consigliato quando i dati vengono inviati usando una connessione TLS protetta.- Gli spazi dei nomi gerarchici non sono supportati con gli account di archiviazione di Azure V2 quando accedono ai dati usando l'interfaccia legacy
wasb://
, ma l'usowasbs://
di supporta gli spazi dei nomi gerarchici.
CREDENTIAL = credential_name
Facoltativo. Specifica una credenziale con ambito database per l'autenticazione nell'origine dati esterna. L'origine dati esterna senza credenziali può accedere all'account di archiviazione pubblico o usare l'identità Microsoft Entra del chiamante per accedere ai file nell'archiviazione di Azure.
Note aggiuntive e indicazioni utili per la creazione delle credenziali:
- Per caricare dati da Archiviazione di Azure o Azure Data Lake Store (ADLS) Gen2 in Azure Synapse Analytics, usare una chiave Archiviazione di Azure.
CREDENTIAL
è obbligatorio solo se i dati sono stati protetti.CREDENTIAL
non è obbligatorio per i set di dati che consentono l'accesso anonimo.
Per creare credenziali con ambito database, vedere CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL).
Nel pool SQL serverless le credenziali con ambito database possono specificare l'identità gestita dell'area di lavoro, il nome dell'entità servizio o il token di firma di accesso condiviso.In serverless SQL pool, database-scoped credentials can specify workspace managed identity, service principal name, or shared access signature (SAS). L'accesso tramite un'identità utente, noto anche come pass-through Di Microsoft Entra, è possibile anche nelle credenziali con ambito database, come l'accesso anonimo all'archiviazione disponibile pubblicamente. Per altre informazioni, vedere Tipi di autorizzazione di archiviazione supportati.
Nel pool SQL dedicato le credenziali con ambito database possono specificare il token di firma di accesso condiviso, la chiave di accesso alle risorse di archiviazione, l'entità servizio, l'identità gestita dell'area di lavoro o il pass-through Di Microsoft Entra.
TYPE = HADOOP
Facoltativo, non consigliato.
È possibile specificare TYPE solo con pool SQL dedicati. HADOOP
è l'unico valore consentito se specificato. Le origini dati esterne con TYPE=HADOOP
sono disponibili solo in pool SQL dedicati.
Usare HADOOP per le implementazioni legacy; in caso contrario, è consigliabile usare l'accesso ai dati nativi più recente. Non specificare l'argomento TYPE per l'uso dell'accesso ai dati nativi più recente.
Per un esempio d'uso di TYPE = HADOOP
per caricare i dati da Archiviazione di Azure, vedere Creare un'origine dati esterna per fare riferimento ad Azure Data Lake Store Gen1 o Gen2 usando un'entità servizio.
I pool SQL serverless e dedicati in Azure Synapse Analytics usano codebase diversi per la virtualizzazione dei dati. I pool SQL serverless supportano una tecnologia di virtualizzazione dei dati nativa. I pool SQL dedicati supportano la virtualizzazione dei dati nativa e PolyBase. La virtualizzazione dei dati PolyBase viene usata quando si crea EXTERNAL DATA SOURCE con TYPE=HADOOP
.
Autorizzazioni
È richiesta l'autorizzazione CONTROL
per il database.
Blocco
Acquisisce un blocco condiviso per l'oggetto EXTERNAL DATA SOURCE
.
Sicurezza
La maggior parte delle origini dati esterne supporta l'autenticazione basata su proxy, usando credenziali con ambito database per creare l'account proxy.
Le chiavi di firma di accesso condiviso sono supportate per l'autenticazione in account di archiviazione di Azure Data Lake Store Gen 2. I clienti che vogliono eseguire l'autenticazione usando una firma di accesso condiviso devono creare credenziali con ambito database in cui IDENTITY = "Shared Access Signature"
e immettere un token di firma di accesso condiviso come segreto.
Se si crea una credenziale con ambito database in cui IDENTITY = "Shared Access Signature"
e si usa un valore di chiave di archiviazione come segreto, verrà visualizzato il messaggio di errore seguente:
'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]'
Esempi
R. Creare un'origine dati esterna per accedere ai dati in Archiviazione di Azure usando l'interfaccia wasb://
In questo esempio l'origine dati esterna è un account Archiviazione di Azure V2 denominato logs
. Il contenitore di archiviazione è denominato daily
. L'origine dati esterna di Archiviazione di Azure è destinata al solo trasferimento dei dati e non supporta il pushdown dei predicati. Gli spazi dei nomi gerarchici non sono supportati quando si accede ai dati tramite l'interfaccia wasb://
. Si noti che quando ci si connette ad Archiviazione di Azure tramite il connettore WASB[s], l'autenticazione deve essere eseguita con una chiave dell'account di archiviazione e non con una firma di accesso condiviso.
Questo esempio usa il metodo di accesso basato su Java HADOOP legacy. L'esempio seguente illustra come creare le credenziali con ambito database per l'autenticazione per Archiviazione di Azure. Specificare la chiave dell'account di Archiviazione di Azure nel segreto della credenziale di database. È possibile specificare qualsiasi stringa nell'identità della credenziale con ambito database perché non viene usata durante l'autenticazione nell'archiviazione di Azure.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
SECRET = '<azure_storage_account_key>';
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
B. Creare un'origine dati esterna per fare riferimento ad Azure Data Lake Storage Gen 1 o 2 usando un'entità servizio
La connettività di Azure Data Lake Store può essere basata sull'URI di ADLS e sull'entità servizio dell'applicazione Microsoft Entra. La documentazione per la creazione di questa applicazione è disponibile in Autenticazione di Data Lake Store tramite Microsoft Entra ID.
-- If you do not have a Master Key on your DW you will need to create one.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- These values come from your Microsoft Entra application used to authenticate to ADLS
CREATE DATABASE SCOPED CREDENTIAL ADLS_credential
WITH
-- IDENTITY = '<clientID>@<OAuth2.0TokenEndPoint>' ,
IDENTITY = '536540b4-4239-45fe-b9a3-629f97591c0c@https://login.microsoftonline.com/42f988bf-85f1-41af-91ab-2d2cd011da47/oauth2/token',
-- SECRET = '<KEY>'
SECRET = 'BjdIlmtKp4Fpyh9hIvr8HJlUida/seM5kQ3EpLAmeDI=';
-- For Gen 1 - Create an external data source
-- TYPE: HADOOP - PolyBase uses Hadoop APIs to access data in Azure Data Lake Storage.
-- LOCATION: Provide Data Lake Storage Gen 1 account name and URI
-- CREDENTIAL: Provide the credential created in the previous step
CREATE EXTERNAL DATA SOURCE AzureDataLakeStore
WITH (
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. Creare un'origine dati esterna per fare riferimento ad Azure Data Lake Store Gen2 usando la chiave dell'account di archiviazione
-- 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. Creare un'origine dati esterna in Azure Data Lake Store Gen2 usando abfs://
Non è necessario specificare SECRET quando ci si connette a un account Azure Data Lake Store Gen2 con il meccanismo Identità gestita.
-- 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
);
Passaggi successivi
- CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL)
- CREATE EXTERNAL FILE FORMAT (Transact-SQL)
- CREATE EXTERNAL TABLE (Transact-SQL)
- CREATE EXTERNAL TABLE AS SELECT (Azure Synapse Analytics)
- CREATE TABLE AS SELECT (Azure Synapse Analytics)
- sys.external_data_sources (Transact-SQL)
- Uso delle firme di accesso condiviso
* Piattaforma di strumenti
analitici (PDW) *
Panoramica: Sistema della piattaforma di analisi
Si applica a: Piattaforma di strumenti analitici (PDW)
Crea un'origine dati esterna per le query PolyBase. Le origini dati esterne vengono usate per stabilire la connettività e supportano il caso d'uso di virtualizzazione dati e caricamento dati con PolyBase.
Sintassi
Per altre informazioni sulle convenzioni della sintassi, vedere Convenzioni della sintassi 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>]' )
[ ; ]
Argomenti
data_source_name
Specifica il nome definito dall'utente per l'origine dati. Il nome deve essere univoco all'interno del server nella piattaforma di strumenti analitici (PDW).
LOCATION = '<prefix>://<path[:port]>'
Fornisce il protocollo di connettività e il percorso dell'origine dati esterna.
Origine dati esterna | Prefisso della posizione del connettore | Percorso |
---|---|---|
Cloudera CDH o Hortonworks HDP | hdfs |
<Namenode>[:port] |
Account di archiviazione di Azure | wasb[s] |
<container>@<storage_account>.blob.core.windows.net |
Percorso:
<Namenode>
= nome del computer, URI del servizio dei nomi o indirizzo IP diNamenode
nel cluster Hadoop. PolyBase deve risolvere tutti i nomi DNS usati dal cluster Hadoop.port
= porta su cui è in ascolto l'origine dati esterna. Per trovare la porta in Hadoop, si usa il parametro di configurazionefs.defaultFS
. L'impostazione predefinita è 8020.<container>
= contenitore dell'account di archiviazione che include i dati. I contenitori radice sono di sola lettura, di conseguenza i dati non possono essere riscritti nel contenitore.<storage_account>
= nome dell'account di archiviazione della risorsa di Azure.
Note aggiuntive e indicazioni utili per l'impostazione della posizione:
- Il motore PDW non verifica l'esistenza dell'origine dati esterna quando viene creato l'oggetto. Per eseguire la convalida, creare una tabella esterna usando l'origine dati esterna.
- Per garantire una semantica di esecuzione di query coerente, usare la stessa origine dati esterna per tutte le tabelle quando si eseguono query su Hadoop.
wasbs
è consigliato quando i dati vengono inviati usando una connessione TLS protetta.- Gli spazi dei nomi gerarchici non sono supportati se vengono usati con account di Archiviazione di Azure tramite wasb://.
- Per garantire la corretta esecuzione delle query di PolyBase durante un failover di
Namenode
di Hadoop, provare a usare un indirizzo IP virtuale per l'istanza diNamenode
del cluster Hadoop. In caso contrario, eseguire un comando ALTER EXTERNAL DATA SOURCE in modo che punti alla nuova posizione.
CREDENTIAL = credential_name
Specifica una credenziale con ambito database per l'autenticazione nell'origine dati esterna.
Note aggiuntive e indicazioni utili per la creazione delle credenziali:
- Per caricare i dati da Archiviazione di Azure in Azure Synapse o PDW, usare una chiave di Archiviazione di Azure.
CREDENTIAL
è obbligatorio solo se i dati sono stati protetti.CREDENTIAL
non è obbligatorio per i set di dati che consentono l'accesso anonimo.
TYPE = [ HADOOP ]
Specifica il tipo dell'origine dati esterna da configurare. Questo parametro non è sempre obbligatorio.
- Usare HADOOP quando l'origine dati esterna è Cloudera, Hortonworks HDP o Archiviazione di Azure.
Per un esempio d'uso di TYPE
= HADOOP
per caricare i dati da Archiviazione di Azure, vedere Creare un'origine dati esterna per fare riferimento ad Hadoop.
RESOURCE_MANAGER_LOCATION = 'ResourceManager_URI[:port]'
In SQL Server 2019 (15.x) non specificare RESOURCE_MANAGER_LOCATION a meno che non ci si connetta a Cloudera CDH, Hortonworks HDP o un account di archiviazione di Azure.
Configurare questo valore facoltativo quando ci si connette a Cloudera CDH, Hortonworks HDP oppure solo a un account di archiviazione di Azure. Per un elenco completo delle versioni di Hadoop supportate, vedere Configurazione della connettività di PolyBase (Transact-SQL).
RESOURCE_MANAGER_LOCATION
Quando viene definito, Query Optimizer prende una decisione basata sui costi per migliorare le prestazioni. È possibile usare un processo MapReduce per eseguire il pushdown del calcolo in Hadoop. Specificando il parametro RESOURCE_MANAGER_LOCATION
, è possibile ridurre significativamente il volume dei dati trasferiti tra Hadoop e SQL e quindi migliorare le prestazioni delle query.
Se non si specifica tale parametro, il push del calcolo in Hadoop è disabilitato per le query PolyBase. In Creare un'origine dati esterna per fare riferimento a Hadoop con il pushdown abilitato viene fornito un esempio concreto, oltre a ulteriori indicazioni.
Il valore RESOURCE_MANAGER_LOCATION non viene convalidato quando si crea l'origine dati esterna. Se si immette un valore errato, potrebbe verificarsi un errore di query in fase di esecuzione quando si prova a usare il pushdown perché non è possibile risolvere il valore specificato.
Affinché PolyBase funzioni correttamente con un'origine dati esterna Hadoop, le porte per i componenti del cluster Hadoop seguenti devono essere aperte:
- Porte HDFS
- Namenode
- Datanode
- Resource Manager
- Invio di processi
- Cronologia dei processi
Se la porta non è specificata, per la scelta del valore predefinito si usa l'impostazione corrente della configurazione 'hadoop connectivity'.
Connettività Hadoop | Porta di gestione risorse predefinita |
---|---|
1 | 50300 |
2 | 50300 |
3 | 8021 |
4 | 8032 |
5 | 8050 |
6 | 8032 |
7 | 8050 |
Nella tabella seguente vengono illustrate le porte predefinite per questi componenti. Si noti che esiste una dipendenza della versione di Hadoop e la possibilità di una configurazione personalizzata che non usa l'assegnazione di porta predefinita.
Componente cluster Hadoop | Porta predefinita |
---|---|
NameNode | 8020 |
DataNode (trasferimento di dati, porta IPC senza privilegi) | 50010 |
DataNode (trasferimento dei dati, porta IPC con privilegi) | 1019 |
Invio di processi di Resource Manager (Hortonworks 1.3) | 50300 |
Invio di processi di Resource Manager (Cloudera 4.3) | 8021 |
Invio di processi di Resource Manager (Hortonworks 2.0 in Windows, Cloudera 5.x in Linux) | 8032 |
Invio di processi di Resource Manager (Hortonworks 2.x, 3.0 in Linux, Hortonworks 2.1-3 in Windows) | 8050 |
Cronologia processi di Resource Manager | 10020 |
Autorizzazioni
Richiede l'autorizzazione CONTROL
per il database nella piattaforma di strumenti analitici (PDW).
Nota
Nelle versioni precedenti di PDW creare le autorizzazioni ALTER ANY EXTERNAL DATA SOURCE
richieste dell'origine dati esterna.
Blocco
Acquisisce un blocco condiviso per l'oggetto EXTERNAL DATA SOURCE
.
Sicurezza
PolyBase supporta l'autenticazione basata su proxy per la maggior parte delle origini dati esterne. Creare credenziali con ambito database per creare l'account proxy.
Il token di firma di accesso condiviso di tipo HADOOP
non è supportato. È supportato solo il tipo BLOB_STORAGE
quando viene usata una chiave di accesso dell'account di archiviazione. Il tentativo di creare un'origine dati esterna di tipo HADOOP
e le credenziali di firma di accesso condiviso potrebbe non riuscire e potrebbe essere visualizzato l'errore:
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.'
Esempi
R. Creare un'origine dati esterna per fare riferimento a Hadoop
Per creare un'origine dati esterna per fare riferimento a Hortonworks HDP o Cloudera CDH, specificare il nome del computer o l'indirizzo IP di Namenode
Hadoop e la porta.
CREATE EXTERNAL DATA SOURCE MyHadoopCluster
WITH (
LOCATION = 'hdfs://10.10.10.10:8050',
TYPE = HADOOP
);
B. Creare un'origine dati esterna per fare riferimento a Hadoop con il pushdown abilitato
Specificare l'opzione RESOURCE_MANAGER_LOCATION
per abilitare il pushdown del calcolo in Hadoop per le query PolyBase. Dopo l'abilitazione, PolyBase prende una decisione basata sui costi per determinare se eseguire il push del calcolo delle query in 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. Creare un'origine dati esterna per fare riferimento a Hadoop con protezione Kerberos
Per verificare se il cluster Hadoop è protetto tramite Kerberos, controllare il valore della proprietà hadoop.security.authentication
nel file core-site.xml di Hadoop. Per fare riferimento a un cluster Hadoop protetto tramite Kerberos, è necessario specificare una credenziale con ambito database che contiene il nome utente e la password di Kerberos. La chiave master del database viene usata per crittografare il segreto della credenziale con ambito database.
-- 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. Creare un'origine dati esterna per accedere ai dati in Archiviazione di Azure usando l'interfaccia wasb://
In questo esempio, l'origine dati esterna è un account di Archiviazione di Azure V2 denominato logs
. Il contenitore di archiviazione è denominato daily
. L'origine dati esterna di Archiviazione di Azure è destinata al solo trasferimento dei dati e non supporta il pushdown dei predicati. Gli spazi dei nomi gerarchici non sono supportati quando si accede ai dati tramite l'interfaccia wasb://
. Si noti che quando ci si connette ad Archiviazione di Azure tramite il connettore WASB[s], l'autenticazione deve essere eseguita con una chiave dell'account di archiviazione e non con una firma di accesso condiviso.
Questo esempio illustra come creare la credenziale con ambito database per l'autenticazione nell'archiviazione di Azure. Specificare la chiave dell'account di archiviazione di Azure nel segreto della credenziale di database. È possibile specificare qualsiasi stringa nell'identità della credenziale con ambito database perché non viene usata durante l'autenticazione nell'archiviazione di Azure.
-- Create a database master key if one does not already exist, using your own password.
-- This key is used to encrypt the credential secret in next step.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
-- Create a database scoped credential with Azure storage account key as the secret.
CREATE DATABASE SCOPED CREDENTIAL AzureStorageCredential
WITH IDENTITY = '<my_account>',
SECRET = '<azure_storage_account_key>';
-- Create an external data source with CREDENTIAL option.
CREATE EXTERNAL DATA SOURCE MyAzureStorage
WITH (
LOCATION = 'wasbs://daily@logs.blob.core.windows.net/',
CREDENTIAL = AzureStorageCredential,
TYPE = HADOOP
);
Passaggi successivi
* Istanza gestita di SQL *
Panoramica: Istanza gestita di SQL di Azure
Si applica a: Istanza gestita di SQL di Azure SQL
Crea un'origine dati esterna in Istanza gestita di SQL di Azure. Per informazioni complete, vedere Virtualizzazione dei dati con Istanza gestita di SQL di Azure.
La virtualizzazione dei dati in Istanza gestita di SQL di Azure consente l'accesso a dati esterni in un'ampia gamma di formati di file tramite la sintassi T-SQL OPENROWSET o la sintassi T-SQL CREATE EXTERNAL TABLE.
Sintassi
Per altre informazioni sulle convenzioni della sintassi, vedere Convenzioni della sintassi Transact-SQL.
CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH
( [ LOCATION = '<prefix>://<path>[:<port>]' ]
[ [ , ] CREDENTIAL = <credential_name> ]
)
[ ; ]
Argomenti
data_source_name
Specifica il nome definito dall'utente per l'origine dati. Il nome deve essere univoco all'interno del database.
LOCATION = '<prefix>://<path[:port]>'
Fornisce il protocollo di connettività e il percorso dell'origine dati esterna.
Origine dati esterna | Prefisso della posizione | Percorso |
---|---|---|
Archiviazione BLOB di Azure | 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> |
Il motore di database non verifica l'esistenza dell'origine dati esterna quando viene creato l'oggetto. Per eseguire la convalida, creare una tabella esterna usando l'origine dati esterna.
Non aggiungere un carattere / finale, un nome file o parametri di firma per l'accesso condiviso alla fine dell'URL LOCATION
quando si configura un'origine dati esterne per le operazioni bulk.
CREDENTIAL = credential_name
Specifica una credenziale con ambito database per l'autenticazione nell'origine dati esterna.
Note aggiuntive e indicazioni utili per la creazione delle credenziali:
- Per caricare i dati da Archiviazione di Azure in Istanza gestita di SQL di Azure, usare una firma di accesso condiviso (token di firma di accesso condiviso).
CREDENTIAL
è obbligatorio solo se i dati sono stati protetti.CREDENTIAL
non è obbligatorio per i set di dati che consentono l'accesso anonimo.- Se è necessaria una credenziale, è necessario creare le credenziali usando
Managed Identity
oSHARED ACCESS SIGNATURE
come IDENTITÀ. Per creare credenziali con ambito database, vedere CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL).
Per usare l'identità del servizio gestito per le credenziali con ambito database:
Specificare
WITH IDENTITY = 'Managed Identity'
- Usare l'identità del servizio gestito assegnata dal sistema del Istanza gestita di SQL di Azure, che deve essere abilitata se deve essere usata a questo scopo.
Concedere il ruolo Controllo degli accessi in base al ruolo di Lettore di Azure all'identità del servizio gestito assegnata dal sistema del Istanza gestita di SQL di Azure ai contenitori di Archiviazione BLOB di Azure necessari. Ad esempio, tramite il portale di Azure, vedere Assegnare ruoli di Azure usando il portale di Azure.
Per creare una firma di accesso condiviso per le credenziali con ambito database:
Specificare
WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = ...
Esistono diversi modi per creare una firma di accesso condiviso:
- È possibile ottenere un token di firma di accesso condiviso passando alla portale di Azure -><Your_Storage_Account> - Firma di accesso condiviso -> Configurare le autorizzazioni ->> Generare firma di accesso condiviso e stringa di connessione. Per altre informazioni, vedere Generare una firma di accesso condiviso.
- È possibile creare e configurare una firma di accesso condiviso con Archiviazione di Azure Explorer.
- È possibile creare una firma di accesso condiviso a livello di codice tramite PowerShell, l'interfaccia della riga di comando di Azure, .NET e l'API REST. Per altre informazioni, vedere Concedere accesso limitato alle risorse di Archiviazione di Azure tramite firme di accesso condiviso.
Il token di firma di accesso condiviso deve essere configurato come segue:
- Quando viene generato, il token di firma di accesso condiviso è preceduto da un punto interrogativo ('?'). Escludere l'elemento iniziale
?
quando configurato come SECRET. - Usare un periodo di scadenza valido (tutte le date sono espresse in formato UTC).
- Concedere almeno l'autorizzazione di lettura per il file che deve essere caricato ( ad esempio
srt=o&sp=r
). È possibile creare più firme di accesso condiviso per casi d'uso diversi. Le autorizzazioni devono essere concesse come segue:
Azione Autorizzazione Lettura di dati da un file Lettura Leggere i dati da più file e sottocartelle Lettura e Lista Usare Create External Table as Select (CETAS) Lettura, creazione e scrittura - Quando viene generato, il token di firma di accesso condiviso è preceduto da un punto interrogativo ('?'). Escludere l'elemento iniziale
Autorizzazioni
Richiede l'autorizzazione CONTROL
sul database in Istanza gestita di SQL di Azure.
Blocco
Acquisisce un blocco condiviso per l'oggetto EXTERNAL DATA SOURCE
.
Esempi
Per altri esempi, vedere Virtualizzazione dei dati con Istanza gestita di SQL di Azure.
R. Eseguire query su dati esterni da Istanza gestita di SQL di Azure con OPENROWSET o una tabella esterna
Per altri esempi, vedere Creare un'origine dati esterna o vedere Virtualizzazione dei dati con Istanza gestita di SQL di Azure.
Creare la chiave master del database, se non esiste.
-- Optional: Create MASTER KEY if it doesn't exist in the database: CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong Password>' GO
Creare le credenziali con ambito database usando un token di firma di accesso condiviso. È anche possibile usare un'identità gestita.
CREATE DATABASE SCOPED CREDENTIAL MyCredential WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<KEY>' ; --Removing leading '?' GO
Creare l'origine dati esterna usando le credenziali.
--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] );
Eseguire query sul file di dati Parquet nell'origine dati esterna usando la sintassi T-SQL OPENROWSET, basandosi sull'inferenza dello schema per esplorare rapidamente i dati senza conoscere lo schema.
--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;
In alternativa, eseguire query sui dati usando OPENROWSET la clausola WITH, invece di basarsi sull'inferenza dello schema, che può eseguire query sui costi di esecuzione. In un file CSV, l'inferenza dello schema non è supportata.
--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;
In alternativa, creare un EXTERNAL FILE FORMAT e un EXTERNAL TABLE per eseguire query sui dati come tabella locale.
-- 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