Copiare e trasformare i dati in Istanza gestita di SQL di Azure usando Azure Data Factory o Synapse Analytics

SI APPLICA A: Azure Data Factory Azure Synapse Analytics

Suggerimento

Provare Data Factory in Microsoft Fabric, una soluzione di analisi completa per le aziende. Microsoft Fabric copre tutti gli elementi, dallo spostamento dei dati all'analisi scientifica dei dati, all'analisi in tempo reale, alla business intelligence e alla creazione di report. Scopri come avviare gratuitamente una nuova versione di valutazione .

Questo articolo illustra come usare l'attività di copia per copiare dati da e per Istanza gestita di SQL di Azure e come usare Flusso di dati per trasformare i dati in Istanza gestita di SQL di Azure. Per altre informazioni, vedere gli articoli introduttivi per Azure Data Factory e Synapse Analytics.

Funzionalità supportate

Questo connettore Istanza gestita di SQL di Azure è supportato per le funzionalità seguenti:

Funzionalità supportate IR Endpoint privato gestito
Attività di copia (origine/sink) (1) (2) ✓ Anteprima pubblica
Flusso di dati di mapping (origine/sink) (1) ✓ Anteprima pubblica
Attività Lookup (1) (2) ✓ Anteprima pubblica
Attività GetMetadata (1) (2) ✓ Anteprima pubblica
Attività script (1) (2) ✓ Anteprima pubblica
Attività stored procedure (1) (2) ✓ Anteprima pubblica

(1) Runtime di integrazione di Azure (2) Runtime di integrazione self-hosted

Per attività Copy, questo connettore database SQL di Azure supporta queste funzioni:

  • La copia dei dati tramite l'autenticazione SQL e l'autenticazione del token dell'applicazione Microsoft Entra con un'entità servizio o identità gestite per le risorse di Azure.
  • Come origine, il recupero dei dati tramite una query SQL o una stored procedure. Per informazioni dettagliate, è anche possibile scegliere di eseguire la copia parallela dall'origine dell'istanza gestita di SQL. Per informazioni dettagliate, vedere la sezione Copia parallela dall'istanza gestita di SQL .
  • Come sink, la creazione automatica della tabella di destinazione se non esiste in base allo schema di origine; aggiunta di dati a una tabella o richiamo di una stored procedure con logica personalizzata durante la copia.

Prerequisiti

Per accedere all'endpoint pubblico Istanza gestita di SQL, è possibile usare un runtime di integrazione di Azure gestito. Assicurarsi di abilitare l'endpoint pubblico e consentire anche il traffico degli endpoint pubblici nel gruppo di sicurezza di rete in modo che il servizio possa connettersi al database. Per altre informazioni, vedere questa guida.

Per accedere all'endpoint privato di Istanza gestita di SQL, configurare un runtime di integrazione self-hosted in grado di accedere al database. Se si effettua il provisioning del runtime di integrazione self-hosted nella stessa rete virtuale dell'istanza gestita, verificare che il computer del runtime di integrazione si trovi in una subnet diversa da quella dell'istanza gestita. Se si effettua il provisioning del runtime di integrazione self-hosted in una rete virtuale diversa da quella dell'istanza gestita, è consigliabile usare un peering di rete virtuale o stabilire una connessione tra reti virtuali. Per altre informazioni, vedere Connettere l'applicazione a Istanza gestita di SQL di Azure.

Operazioni preliminari

Per eseguire l'attività di copia con una pipeline, è possibile usare uno degli strumenti o SDK seguenti:

Creare un servizio collegato a un'istanza gestita di SQL di Azure usando l'interfaccia utente

Usare la procedura seguente per creare un servizio collegato a un'istanza gestita di SQL nell'interfaccia utente di portale di Azure.

  1. Passare alla scheda Gestisci nell'area di lavoro di Azure Data Factory o Synapse e selezionare Servizi collegati, quindi fare clic su Nuovo:

  2. Cercare SQL e selezionare il connettore azure SQL Server Istanza gestita.

    Screenshot del connettore Istanza gestita azure SQL Server.

  3. Configurare i dettagli del servizio, testare la connessione e creare il nuovo servizio collegato.

    Screenshot della configurazione del servizio collegato per un'istanza gestita di SQL.

Dettagli di configurazione di Connessione or

Le sezioni seguenti forniscono informazioni dettagliate sulle proprietà usate per definire entità di Azure Data Factory specifiche del connettore Istanza gestita di SQL.

Proprietà del servizio collegato

Queste proprietà generiche sono supportate per un servizio collegato Istanza gestita di SQL:

Proprietà Descrizione Richiesto
type La proprietà type deve essere impostata su AzureSqlMI.
connectionString Questa proprietà specifica le informazioni connectionString necessarie per connettersi a Istanza gestita di SQL tramite l'autenticazione SQL. Per altre informazioni, vedere gli esempi seguenti.
La porta predefinita è 1433. Se si usa Istanza gestita di SQL con un endpoint pubblico, specificare in modo esplicito la porta 3342.
È anche possibile inserire una password in Azure Key Vault. Se si tratta dell'autenticazione SQL, estrarre la password configurazione dal stringa di connessione. Per altre informazioni, vedere l'esempio JSON che segue la tabella e Archiviare le credenziali in Azure Key Vault.
azureCloudType Per l'autenticazione dell'entità servizio, specificare il tipo di ambiente cloud di Azure a cui è registrata l'applicazione Microsoft Entra.
I valori consentiti sono AzurePublic, AzureChina, AzureUsGovernment e AzureGermany. Per impostazione predefinita, viene usato l'ambiente cloud del servizio.
No
alwaysEncrypted Impostazioni Specificare le informazioni alwaysencryptedsettings necessarie per abilitare Always Encrypted per proteggere i dati sensibili archiviati in SQL Server usando l'identità gestita o l'entità servizio. Per altre informazioni, vedere l'esempio JSON che segue la tabella e la sezione Uso di Always Encrypted . Se non specificato, l'impostazione predefinita è sempre crittografata è disabilitata. No
connectVia Questo runtime di integrazione viene usato per connettersi all'archivio dati. È possibile usare un runtime di integrazione self-hosted o un runtime di integrazione di Azure se l'istanza gestita ha un endpoint pubblico e consente al servizio di accedervi. Se non specificato, viene usato il runtime di integrazione di Azure predefinito.

Per i diversi tipi di autenticazione, fare riferimento alle sezioni seguenti sulle proprietà specifiche, i prerequisiti e gli esempi JSON, rispettivamente:

Autenticazione SQL

Per usare il tipo di autenticazione SQL, specificare le proprietà generiche descritte nella sezione precedente.

Esempio 1: usare l'autenticazione SQL

{
    "name": "AzureSqlMILinkedService",
    "properties": {
        "type": "AzureSqlMI",
        "typeProperties": {
            "connectionString": "Data Source=<hostname,port>;Initial Catalog=<databasename>;Integrated Security=False;User ID=<username>;Password=<password>;"
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

Esempio 2: usare l'autenticazione SQL con una password in Azure Key Vault

{
    "name": "AzureSqlMILinkedService",
    "properties": {
        "type": "AzureSqlMI",
        "typeProperties": {
            "connectionString": "Data Source=<hostname,port>;Initial Catalog=<databasename>;Integrated Security=False;User ID=<username>;",
            "password": { 
                "type": "AzureKeyVaultSecret", 
                "store": { 
                    "referenceName": "<Azure Key Vault linked service name>", 
                    "type": "LinkedServiceReference" 
                }, 
                "secretName": "<secretName>" 
            }
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

Esempio 3: usare l'autenticazione SQL con Always Encrypted

{
    "name": "AzureSqlMILinkedService",
    "properties": {
        "type": "AzureSqlMI",
        "typeProperties": {
            "connectionString": "Data Source=<hostname,port>;Initial Catalog=<databasename>;Integrated Security=False;User ID=<username>;Password=<password>;"
        },
        "alwaysEncryptedSettings": {
            "alwaysEncryptedAkvAuthType": "ServicePrincipal",
            "servicePrincipalId": "<service principal id>",
            "servicePrincipalKey": {
                "type": "SecureString",
                "value": "<service principal key>"
            }
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

Autenticazione dell'entità servizio

Per usare l'autenticazione dell'entità servizio, oltre alle proprietà generiche descritte nella sezione precedente, specificare le proprietà seguenti

Proprietà Descrizione Richiesto
servicePrincipalId Specificare l'ID client dell'applicazione.
servicePrincipalKey Specificare la chiave dell'applicazione. Contrassegnare questo campo come SecureString per archiviarlo in modo sicuro o fare riferimento a un segreto archiviato in Azure Key Vault.
tenant Specificare le informazioni sul tenant, ad esempio il nome di dominio o l'ID tenant, in cui risiede l'applicazione. Recuperarlo passando il cursore del mouse sull'angolo superiore destro del portale di Azure.

È anche necessario seguire la procedura seguente:

  1. Seguire la procedura per effettuare il provisioning di un amministratore di Microsoft Entra per il Istanza gestita.

  2. Creare un'applicazione Microsoft Entra dal portale di Azure. Prendere nota del nome dell'applicazione e dei valori seguenti che definiscono il servizio collegato:

    • ID applicazione
    • Chiave applicazione
    • ID tenant
  3. Creare account di accesso per l'entità servizio. In SQL Server Management Studio (SSMS) connettersi all'istanza gestita usando un account di SQL Server che è un sysadmin. Eseguire il codice T-SQL seguente nel database master:

    CREATE LOGIN [your application name] FROM EXTERNAL PROVIDER
    
  4. Creare utenti del database indipendente per l'entità servizio. Connettersi al database da cui o in cui si vuole copiare i dati ed eseguire il codice T-SQL seguente:

    CREATE USER [your application name] FROM EXTERNAL PROVIDER
    
  5. Concedere all'entità servizio le autorizzazioni necessarie normalmente per utenti SQL e altri utenti. Eseguire il codice seguente. Per altre opzioni, vedere questo documento.

    ALTER ROLE [role name e.g. db_owner] ADD MEMBER [your application name]
    
  6. Configurare un servizio collegato Istanza gestita di SQL.

Esempio: usare l'autenticazione dell'entità servizio

{
    "name": "AzureSqlDbLinkedService",
    "properties": {
        "type": "AzureSqlMI",
        "typeProperties": {
            "connectionString": "Data Source=<hostname,port>;Initial Catalog=<databasename>;",
            "servicePrincipalId": "<service principal id>",
            "servicePrincipalKey": {
                "type": "SecureString",
                "value": "<service principal key>"
            },
            "tenant": "<tenant info, e.g. microsoft.onmicrosoft.com>"
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

Autenticazione dell'identità gestita assegnata dal sistema

Una data factory o un'area di lavoro di Synapse può essere associata a un'identità gestita assegnata dal sistema per le risorse di Azure che rappresenta il servizio per l'autenticazione ad altri servizi di Azure. È possibile usare questa identità gestita per l'autenticazione Istanza gestita di SQL. Il servizio designato può accedere e copiare dati da o nel database usando questa identità.

Per usare l'autenticazione dell'identità gestita assegnata dal sistema, specificare le proprietà generiche descritte nella sezione precedente e seguire questa procedura.

  1. Seguire la procedura per effettuare il provisioning di un amministratore di Microsoft Entra per il Istanza gestita.

  2. Creare account di accesso per l'identità gestita assegnata dal sistema. In SQL Server Management Studio (SSMS) connettersi all'istanza gestita usando un account di SQL Server che è un sysadmin. Eseguire il codice T-SQL seguente nel database master:

    CREATE LOGIN [your_factory_or_workspace_ name] FROM EXTERNAL PROVIDER
    
  3. Creare utenti di database indipendenti per l'identità gestita assegnata dal sistema. Connettersi al database da cui o in cui si vuole copiare i dati ed eseguire il codice T-SQL seguente:

    CREATE USER [your_factory_or_workspace_name] FROM EXTERNAL PROVIDER
    
  4. Concedere le autorizzazioni necessarie all'identità gestita assegnata dal sistema come in genere per gli utenti SQL e altri utenti. Eseguire il codice seguente. Per altre opzioni, vedere questo documento.

    ALTER ROLE [role name e.g. db_owner] ADD MEMBER [your_factory_or_workspace_name]
    
  5. Configurare un servizio collegato Istanza gestita di SQL.

Esempio: usa l'autenticazione dell'identità gestita assegnata dal sistema

{
    "name": "AzureSqlDbLinkedService",
    "properties": {
        "type": "AzureSqlMI",
        "typeProperties": {
            "connectionString": "Data Source=<hostname,port>;Initial Catalog=<databasename>;"
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

Autenticazione dell'identità gestita assegnata dall'utente

Una data factory o un'area di lavoro di Synapse può essere associata a identità gestite assegnate dall'utente che rappresenta il servizio per l'autenticazione ad altri servizi di Azure. È possibile usare questa identità gestita per l'autenticazione Istanza gestita di SQL. Il servizio designato può accedere e copiare dati da o nel database usando questa identità.

Per usare l'autenticazione dell'identità gestita assegnata dall'utente, oltre alle proprietà generiche descritte nella sezione precedente, specificare le proprietà seguenti:

Proprietà Descrizione Richiesto
credentials Specificare l'identità gestita assegnata dall'utente come oggetto credenziale.

È anche necessario seguire la procedura seguente:

  1. Seguire la procedura per effettuare il provisioning di un amministratore di Microsoft Entra per il Istanza gestita.

  2. Creare account di accesso per l'identità gestita assegnata dall'utente. In SQL Server Management Studio (SSMS) connettersi all'istanza gestita usando un account di SQL Server che è un sysadmin. Eseguire il codice T-SQL seguente nel database master:

    CREATE LOGIN [your_factory_or_workspace_ name] FROM EXTERNAL PROVIDER
    
  3. Creare utenti di database indipendenti per l'identità gestita assegnata dall'utente. Connettersi al database da cui o in cui si vuole copiare i dati ed eseguire il codice T-SQL seguente:

    CREATE USER [your_factory_or_workspace_name] FROM EXTERNAL PROVIDER
    
  4. Creare una o più identità gestite assegnate dall'utente e concedere le autorizzazioni necessarie per l'identità gestita assegnata dall'utente, come normalmente si fa per gli utenti SQL e altri utenti. Eseguire il codice seguente. Per altre opzioni, vedere questo documento.

    ALTER ROLE [role name e.g. db_owner] ADD MEMBER [your_factory_or_workspace_name]
    
  5. Assegnare una o più identità gestite assegnate dall'utente alla data factory e creare le credenziali per ogni identità gestita assegnata dall'utente.

  6. Configurare un servizio collegato Istanza gestita di SQL.

Esempio: usa l'autenticazione dell'identità gestita assegnata dall'utente

{
    "name": "AzureSqlDbLinkedService",
    "properties": {
        "type": "AzureSqlMI",
        "typeProperties": {
            "connectionString": "Data Source=<hostname,port>;Initial Catalog=<databasename>;",
            "credential": {
                "referenceName": "credential1",
                "type": "CredentialReference"
            }
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

Proprietà del set di dati

Per un elenco completo delle sezioni e delle proprietà disponibili per definire set di dati, vedere l'articolo sui set di dati. In questa sezione viene fornito un elenco delle proprietà supportate dal set di dati Istanza gestita di SQL.

Per copiare dati da e verso Istanza gestita di SQL, sono supportate le proprietà seguenti:

Proprietà Descrizione Richiesto
type La proprietà type del set di dati deve essere impostata su AzureSqlMITable.
schema Nome dello schema. No per l'origine, Sì per il sink
table Nome della tabella/vista. No per l'origine, Sì per il sink
tableName Nome della tabella/vista con schema. Questa proprietà è supportata per garantire la compatibilità con le versioni precedenti. Per i nuovi carichi di lavoro, usare schema e table. No per l'origine, Sì per il sink

Esempio

{
    "name": "AzureSqlMIDataset",
    "properties":
    {
        "type": "AzureSqlMITable",
        "linkedServiceName": {
            "referenceName": "<SQL Managed Instance linked service name>",
            "type": "LinkedServiceReference"
        },
        "schema": [ < physical schema, optional, retrievable during authoring > ],
        "typeProperties": {
            "schema": "<schema_name>",
            "table": "<table_name>"
        }
    }
}

Proprietà dell'attività di copia

Per un elenco completo delle sezioni e delle proprietà disponibili per definire le attività, vedere l'articolo sulle pipeline. In questa sezione viene fornito un elenco delle proprietà supportate dall'origine e dal sink Istanza gestita di SQL.

Istanza gestita di SQL come origine

Suggerimento

Per caricare i dati dall'istanza gestita di SQL in modo efficiente usando il partizionamento dei dati, vedere Copia parallela dall'istanza gestita di SQL.

Per copiare dati da Istanza gestita di SQL, nella sezione origine dell'attività di copia sono supportate le proprietà seguenti:

Proprietà Descrizione Richiesto
type La proprietà type dell'origine dell'attività di copia deve essere impostata su SqlMISource.
sqlReaderQuery Questa proprietà usa la query SQL personalizzata per leggere i dati. Un esempio è select * from MyTable. No
sqlReaderStoredProcedureName Questa proprietà definisce il nome della stored procedure che legge i dati dalla tabella di origine. L'ultima istruzione SQL deve essere un'istruzione SELECT nella stored procedure. No
storedProcedureParameters Questi parametri sono relativi alla stored procedure.
I valori consentiti sono coppie nome-valore. I nomi e l'uso di maiuscole e minuscole dei parametri devono corrispondere a quelli dei parametri della stored procedure.
No
isolationLevel Specifica il comportamento di blocco della transazione per l'origine SQL. I valori consentiti sono: ReadCommitted, ReadUncommitted, RepeatableRead, Serializable, Snapshot. Se non specificato, viene utilizzato il livello di isolamento predefinito del database. Per altre informazioni dettagliate, vedere questo documento. No
partitionOptions Specifica le opzioni di partizionamento dei dati usate per caricare i dati dall'istanza gestita di SQL.
I valori consentiti sono: Nessuno (impostazione predefinita), PhysicalPartitionsOfTable e DynamicRange.
Quando un'opzione di partizione è abilitata (ovvero , non None), il grado di parallelismo per caricare simultaneamente i dati dall'istanza gestita di SQL viene controllato dall'impostazione nell'attività parallelCopies di copia.
No
partitionSettings Specifica il gruppo di impostazioni per il partizionamento dei dati.
Applicare quando l'opzione di partizione non Noneè .
No
In partitionSettings:
partitionColumnName Specificare il nome della colonna di origine nel tipo integer o date/datetime (int, smallint, datebigint, smalldatetimedatetimedatetime2, o datetimeoffset) che verrà usato dal partizionamento dell'intervallo per la copia parallela. Se non specificato, l'indice o la chiave primaria della tabella vengono rilevati automaticamente e usati come colonna di partizione.
Si applica quando l'opzione di partizione è DynamicRange. Se si usa una query per recuperare i dati di origine, associare ?AdfDynamicRangePartitionCondition nella clausola WHERE. Per un esempio, vedere la sezione Copia parallela dal database SQL.
No
partitionUpperBound Valore massimo della colonna di partizione per la suddivisione dell'intervallo di partizioni. Questo valore viene usato per decidere lo stride della partizione, non per filtrare le righe nella tabella. Tutte le righe nella tabella o nel risultato della query verranno partizionate e copiate. Se non specificato, l'attività di copia rileva automaticamente il valore.
Si applica quando l'opzione di partizione è DynamicRange. Per un esempio, vedere la sezione Copia parallela dal database SQL.
No
partitionLowerBound Valore minimo della colonna di partizione per la suddivisione dell'intervallo di partizioni. Questo valore viene usato per decidere lo stride della partizione, non per filtrare le righe nella tabella. Tutte le righe nella tabella o nel risultato della query verranno partizionate e copiate. Se non specificato, l'attività di copia rileva automaticamente il valore.
Si applica quando l'opzione di partizione è DynamicRange. Per un esempio, vedere la sezione Copia parallela dal database SQL.
No

Tenere presente quanto segue:

  • Se sqlReaderQuery viene specificato per SqlMISource, l'attività di copia esegue questa query sull'origine Istanza gestita di SQL per ottenere i dati. In alternativa, è possibile specificare una stored procedure indicando i parametri sqlReaderStoredProcedureName e storedProcedureParameters, se la stored procedure accetta parametri.
  • Quando si usa la stored procedure nell'origine per recuperare i dati, si noti se la stored procedure è progettata come restituzione di uno schema diverso quando viene passato un valore di parametro diverso, è possibile che si verifichi un errore o si verifichi un risultato imprevisto durante l'importazione dello schema dall'interfaccia utente o quando si copiano dati nel database SQL con la creazione automatica della tabella.

Esempio: Usare una query SQL

"activities":[
    {
        "name": "CopyFromAzureSqlMI",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<SQL Managed Instance input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "SqlMISource",
                "sqlReaderQuery": "SELECT * FROM MyTable"
            },
            "sink": {
                "type": "<sink type>"
            }
        }
    }
]

Esempio: Usare una stored procedure

"activities":[
    {
        "name": "CopyFromAzureSqlMI",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<SQL Managed Instance input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "SqlMISource",
                "sqlReaderStoredProcedureName": "CopyTestSrcStoredProcedureWithParameters",
                "storedProcedureParameters": {
                    "stringData": { "value": "str3" },
                    "identifier": { "value": "$$Text.Format('{0:yyyy}', <datetime parameter>)", "type": "Int"}
                }
            },
            "sink": {
                "type": "<sink type>"
            }
        }
    }
]

Definizione della stored procedure

CREATE PROCEDURE CopyTestSrcStoredProcedureWithParameters
(
    @stringData varchar(20),
    @identifier int
)
AS
SET NOCOUNT ON;
BEGIN
    select *
    from dbo.UnitTestSrcTable
    where dbo.UnitTestSrcTable.stringData != stringData
    and dbo.UnitTestSrcTable.identifier != identifier
END
GO

Istanza gestita di SQL come sink

Suggerimento

Altre informazioni sui comportamenti di scrittura, le configurazioni e le procedure consigliate supportate sono disponibili in Procedure consigliate per il caricamento dei dati in Istanza gestita di SQL.

Per copiare i dati in Istanza gestita di SQL, nella sezione sink dell'attività di copia sono supportate le proprietà seguenti:

Proprietà Descrizione Richiesto
type La proprietà type del sink dell'attività di copia deve essere impostata su SqlMISink.
preCopyScript Questa proprietà specifica una query SQL per l'attività di copia da eseguire prima di scrivere dati in Istanza gestita di SQL. Viene richiamata solo una volta per ogni esecuzione della copia. È possibile usare questa proprietà per pulire i dati precaricati. No
tableOption Specifica se creare automaticamente la tabella sink se non esiste in base allo schema di origine. La creazione automatica della tabella non è supportata quando il sink specifica la stored procedure. I valori consentiti sono: none (impostazione predefinita), autoCreate. No
sqlWriterStoredProcedureName Il nome della stored procedure che definisce come applicare i dati di origine in una tabella di destinazione.
Questa stored procedure viene richiamata per batch. Per le operazioni eseguite una sola volta e non hanno nulla a che fare con i dati di origine, ad esempio, eliminare o troncare, usare la preCopyScript proprietà .
Vedere l'esempio di Richiamare una stored procedure da un sink SQL.
No
storedProcedureTableTypeParameterName Nome del parametro del tipo di tabella specificato nella stored procedure. No
sqlWriterTableType Nome del tipo di tabella da utilizzare nella stored procedure. Nel corso dell'attività di copia, i dati spostati vengono resi disponibili in una tabella temporanea di questo tipo. Il codice della stored procedure può quindi unire i dati di cui è in corso la copia con i dati esistenti. No
storedProcedureParameters Parametri per la stored procedure.
I valori consentiti sono coppie nome-valore. I nomi e le maiuscole e minuscole dei parametri devono corrispondere ai nomi e alle maiuscole e minuscole dei parametri della stored procedure.
No
writeBatchSize Numero di righe da inserire nella tabella SQL per batch.
I valori consentiti sono integer per il numero di righe. Per impostazione predefinita, il servizio determina in modo dinamico le dimensioni del batch appropriate in base alle dimensioni della riga.
No
writeBatchTimeout Tempo di attesa per il completamento dell'operazione di inserimento, upsert e stored procedure prima del timeout.
I valori consentiti sono relativi all'intervallo di tempo. Un esempio è "00:30:00" per 30 minuti. Se non viene specificato alcun valore, per impostazione predefinita il timeout è "00:30:00".
No
 maxConcurrent Connessione ions Limite massimo di connessioni simultanee stabilite all'archivio dati durante l'esecuzione dell'attività. Specificare un valore solo quando si desidera limitare le connessioni simultanee.  No
WriteBehavior Specificare il comportamento di scrittura per l'attività di copia per caricare i dati nell'istanza gestita di SQL di Azure.
Il valore consentito è Insert e Upsert. Per impostazione predefinita, il servizio usa insert per caricare i dati.
No
upsert Impostazioni Specificare il gruppo delle impostazioni per il comportamento di scrittura.
Applicare quando l'opzione WriteBehavior è Upsert.
No
In upsertSettings:
useTempDB Specificare se utilizzare una tabella temporanea globale o una tabella fisica come tabella provvisoria per upsert.
Per impostazione predefinita, il servizio usa una tabella temporanea globale come tabella provvisoria. value è true.
No
interimSchemaName Specificare lo schema provvisorio per la creazione di una tabella provvisoria se viene utilizzata la tabella fisica. Nota: l'utente deve disporre dell'autorizzazione per la creazione e l'eliminazione di una tabella. Per impostazione predefinita, la tabella provvisoria condividerà lo stesso schema della tabella sink.
Applicare quando l'opzione useTempDB è False.
No
keys Specificare i nomi di colonna per l'identificazione univoca delle righe. È possibile usare una singola chiave o una serie di chiavi. Se non specificato, viene usata la chiave primaria. No

Esempio 1: Aggiungere dati

"activities":[
    {
        "name": "CopyToAzureSqlMI",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<SQL Managed Instance output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "<source type>"
            },
            "sink": {
                "type": "SqlMISink",
                "tableOption": "autoCreate",
                "writeBatchSize": 100000
            }
        }
    }
]

Esempio 2: Richiamare una stored procedure durante la copia

Per altre informazioni, vedere Richiamare una stored procedure da un sink di istanza gestita di SQL.

"activities":[
    {
        "name": "CopyToAzureSqlMI",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<SQL Managed Instance output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "<source type>"
            },
            "sink": {
                "type": "SqlMISink",
                "sqlWriterStoredProcedureName": "CopyTestStoredProcedureWithParameters",
                "storedProcedureTableTypeParameterName": "MyTable",
                "sqlWriterTableType": "MyTableType",
                "storedProcedureParameters": {
                    "identifier": { "value": "1", "type": "Int" },
                    "stringData": { "value": "str1" }
                }
            }
        }
    }
]

Esempio 3: Upsert data

"activities":[
    {
        "name": "CopyToAzureSqlMI",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<SQL Managed Instance output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "<source type>"
            },
            "sink": {
                "type": "SqlMISink",
                "tableOption": "autoCreate",
                "writeBehavior": "upsert",
                "upsertSettings": {
                    "useTempDB": true,
                    "keys": [
                        "<column name>"
                    ]
                },            
            }
        }
    }
]

Copia parallela dall'istanza gestita di SQL

Il connettore Istanza gestita di SQL di Azure nell'attività di copia fornisce il partizionamento dei dati predefinito per copiare i dati in parallelo. È possibile trovare le opzioni di partizionamento dei dati nella scheda Origine dell'attività di copia.

Screenshot delle opzioni di partizione

Quando si abilita la copia partizionata, l'attività di copia esegue query parallele sull'origine DELL'istanza gestita di SQL per caricare i dati in base alle partizioni. Il grado di parallelismo è controllato dall'impostazione parallelCopies sull'attività di copia. Ad esempio, se si imposta parallelCopies su quattro, il servizio genera e esegue simultaneamente quattro query in base all'opzione e alle impostazioni di partizione specificate e ogni query recupera una parte di dati dall'istanza gestita di SQL.

È consigliabile abilitare la copia parallela con il partizionamento dei dati, soprattutto quando si caricano grandi quantità di dati dall'istanza gestita di SQL. Di seguito sono riportate le configurazioni consigliate per i diversi scenari: Quando si copiano dati in un archivio dati basato su file, è consigliabile scrivere in una cartella come più file (specificare solo il nome della cartella), nel qual caso le prestazioni sono migliori rispetto alla scrittura in un singolo file.

Scenario Impostazioni consigliate
Caricamento completo da tabelle di grandi dimensioni, con partizioni fisiche. Opzione di partizione: partizioni fisiche della tabella.

Durante l'esecuzione, il servizio rileva automaticamente le partizioni fisiche e copia i dati in base alle partizioni.

Per verificare se la tabella contiene o meno una partizione fisica, è possibile fare riferimento a questa query.
Caricamento completo da una tabella di grandi dimensioni, senza partizioni fisiche, mentre con una colonna integer o datetime per il partizionamento dei dati. Opzioni di partizione: partizione intervallo dinamico.
Colonna di partizione (facoltativa): specificare la colonna usata per partizionare i dati. Se non specificato, viene utilizzata la colonna di indice o chiave primaria.
Limite superiore della partizione e limite inferiore della partizione (facoltativo): specificare se si desidera determinare lo stride della partizione. Non si tratta di filtrare le righe nella tabella, tutte le righe della tabella verranno partizionate e copiate. Se non specificato, l'attività di copia rileva automaticamente i valori.

Ad esempio, se la colonna di partizione "ID" ha valori compresi tra 1 e 100 e si imposta il limite inferiore su 20 e il limite superiore come 80, con copia parallela come 4, il servizio recupera i dati rispettivamente per 4 partizioni - ID nell'intervallo <=20, [21, 50], [51, 80]e >=81.
Caricare una grande quantità di dati usando una query personalizzata, senza partizioni fisiche, mentre con una colonna integer o date/datetime per il partizionamento dei dati. Opzioni di partizione: partizione intervallo dinamico.
Query: SELECT * FROM <TableName> WHERE ?AdfDynamicRangePartitionCondition AND <your_additional_where_clause>.
Colonna di partizione: specificare la colonna usata per partizionare i dati.
Limite superiore della partizione e limite inferiore della partizione (facoltativo): specificare se si desidera determinare lo stride della partizione. Non si tratta di filtrare le righe nella tabella, tutte le righe nel risultato della query verranno partizionate e copiate. Se non specificato, l'attività di copia rileva automaticamente il valore.

Durante l'esecuzione, il servizio sostituisce ?AdfRangePartitionColumnName con il nome di colonna e gli intervalli di valori effettivi per ogni partizione e invia all'istanza gestita di SQL.
Ad esempio, se la colonna di partizione "ID" include valori compresi tra 1 e 100 e si imposta il limite inferiore su 20 e il limite superiore come 80, con copia parallela come 4, il servizio recupera i dati per 4 partizioni- ID nell'intervallo <=20, [21, 50], [51, 80], e >=81 rispettivamente.

Di seguito sono riportate altre query di esempio per diversi scenari:
1. Eseguire una query sull'intera tabella:
SELECT * FROM <TableName> WHERE ?AdfDynamicRangePartitionCondition
2. Eseguire una query da una tabella con la selezione di colonne e filtri aggiuntivi della clausola where:
SELECT <column_list> FROM <TableName> WHERE ?AdfDynamicRangePartitionCondition AND <your_additional_where_clause>
3. Eseguire una query con sottoquery:
SELECT <column_list> FROM (<your_sub_query>) AS T WHERE ?AdfDynamicRangePartitionCondition AND <your_additional_where_clause>
4. Eseguire una query con la partizione nella sottoquery:
SELECT <column_list> FROM (SELECT <your_sub_query_column_list> FROM <TableName> WHERE ?AdfDynamicRangePartitionCondition) AS T

Procedure consigliate per caricare i dati con l'opzione di partizione:

  1. Scegliere una colonna distintiva come colonna di partizione (ad esempio chiave primaria o chiave univoca) per evitare l'asimmetria dei dati.
  2. Se la tabella include una partizione predefinita, usare l'opzione di partizione "Partizioni fisiche della tabella" per ottenere prestazioni migliori.
  3. Se si usa Azure Integration Runtime per copiare i dati, è possibile impostare unità di Integrazione dei dati (DIU) di dimensioni maggiori (>4) per usare più risorse di calcolo. Controllare gli scenari applicabili.
  4. "Grado di parallelismo di copia" controlla i numeri di partizione, impostando questo numero troppo grande a volte le prestazioni, è consigliabile impostare questo numero come (DIU o numero di nodi del runtime di integrazione self-hosted) * (da 2 a 4).

Esempio: caricamento completo da una tabella di grandi dimensioni con partizioni fisiche

"source": {
    "type": "SqlMISource",
    "partitionOption": "PhysicalPartitionsOfTable"
}

Esempio: query con partizione a intervalli dinamici

"source": {
    "type": "SqlMISource",
    "query": "SELECT * FROM <TableName> WHERE ?AdfDynamicRangePartitionCondition AND <your_additional_where_clause>",
    "partitionOption": "DynamicRange",
    "partitionSettings": {
        "partitionColumnName": "<partition_column_name>",
        "partitionUpperBound": "<upper_value_of_partition_column (optional) to decide the partition stride, not as data filter>",
        "partitionLowerBound": "<lower_value_of_partition_column (optional) to decide the partition stride, not as data filter>"
    }
}

Query di esempio per controllare la partizione fisica

SELECT DISTINCT s.name AS SchemaName, t.name AS TableName, pf.name AS PartitionFunctionName, c.name AS ColumnName, iif(pf.name is null, 'no', 'yes') AS HasPartition
FROM sys.tables AS t
LEFT JOIN sys.objects AS o ON t.object_id = o.object_id
LEFT JOIN sys.schemas AS s ON o.schema_id = s.schema_id
LEFT JOIN sys.indexes AS i ON t.object_id = i.object_id 
LEFT JOIN sys.index_columns AS ic ON ic.partition_ordinal > 0 AND ic.index_id = i.index_id AND ic.object_id = t.object_id 
LEFT JOIN sys.columns AS c ON c.object_id = ic.object_id AND c.column_id = ic.column_id 
LEFT JOIN sys.partition_schemes ps ON i.data_space_id = ps.data_space_id 
LEFT JOIN sys.partition_functions pf ON pf.function_id = ps.function_id 
WHERE s.name='[your schema]' AND t.name = '[your table name]'

Se la tabella ha una partizione fisica, viene visualizzato "HasPartition" come "sì" come illustrato di seguito.

Risultato della query SQL

Procedura consigliata per il caricamento dei dati in Istanza gestita di SQL

Quando si copiano dati in Istanza gestita di SQL, potrebbe essere necessario un comportamento di scrittura diverso:

  • Append: i dati di origine hanno solo nuovi record.
  • Upsert: i dati di origine hanno sia inserimenti che aggiornamenti.
  • Sovrascrittura: si vuole ricaricare l'intera tabella delle dimensioni ogni volta.
  • Scrivere con logica personalizzata: è necessaria un'elaborazione aggiuntiva prima dell'inserimento finale nella tabella di destinazione.

Vedere le rispettive sezioni per informazioni su come configurare e procedure consigliate.

Accodare dati

L'aggiunta dei dati è il comportamento predefinito del connettore sink Istanza gestita di SQL. Il servizio esegue un inserimento bulk per scrivere nella tabella in modo efficiente. È possibile configurare l'origine e il sink di conseguenza nell'attività di copia.

Eseguire l'upsert dei dati

attività Copy supporta ora il caricamento nativo dei dati in una tabella temporanea del database e quindi l'aggiornamento dei dati nella tabella sink se la chiave esiste e in caso contrario inserisce nuovi dati. Per altre informazioni sulle impostazioni upsert nelle attività di copia, vedere Istanza gestita di SQL come sink.

Sovrascrivere l'intera tabella

È possibile configurare la proprietà preCopyScript in un sink dell'attività di copia. In questo caso, per ogni attività di copia eseguita, il servizio esegue prima lo script. Esegue quindi la copia per inserire i dati. Ad esempio, per sovrascrivere l'intera tabella con i dati più recenti, specificare uno script per eliminare prima di eseguire il caricamento bulk dei nuovi dati dall'origine.

Scrivere dati con logica personalizzata

I passaggi per scrivere dati con logica personalizzata sono simili a quelli descritti nella sezione Dati Upsert . Quando è necessario applicare un'elaborazione aggiuntiva prima dell'inserimento finale dei dati di origine nella tabella di destinazione, è possibile caricare in una tabella di staging e quindi richiamare un'attività stored procedure nel sink dell'attività di copia per applicare i dati.

Richiamare una stored procedure da un sink SQL

Quando si copiano dati in Istanza gestita di SQL, è anche possibile configurare e richiamare una stored procedure specificata dall'utente con parametri aggiuntivi in ogni batch della tabella di origine. La funzionalità di stored procedure sfrutta i parametri valutati a livello di tabella.

È possibile usare una stored procedure quando non si possono usare i meccanismi di copia predefiniti. Un esempio è quando si desidera applicare un'elaborazione aggiuntiva prima dell'inserimento finale dei dati di origine nella tabella di destinazione. Alcuni esempi di elaborazione aggiuntivi sono quando si desidera unire colonne, cercare valori aggiuntivi e inserire in più tabelle.

Nell'esempio seguente viene illustrato come usare una stored procedure per eseguire un'operazione upsert in una tabella del database SQL Server. Si supponga che i dati di input e la tabella Marketing sink abbiano ognuna tre colonne: ProfileID, State e Category. Eseguire l'upsert in base alla colonna ProfileID e applicarlo solo per una categoria specifica denominata "ProductA".

  1. Nel database definire il tipo di tabella con lo stesso nome di sqlWriterTableType. Lo schema del tipo di tabella è identico allo schema restituito dai dati di input.

    CREATE TYPE [dbo].[MarketingType] AS TABLE(
        [ProfileID] [varchar](256) NOT NULL,
        [State] [varchar](256) NOT NULL,
        [Category] [varchar](256) NOT NULL
    )
    
  2. Nel database definire la stored procedure con lo stesso nome di sqlWriterStoredProcedureName. che gestisce i dati di input dell'origine specificata e li unisce nella tabella di output. Il nome del parametro del tipo di tabella nella stored procedure è uguale a tableName definito nel set di dati.

    CREATE PROCEDURE spOverwriteMarketing @Marketing [dbo].[MarketingType] READONLY, @category varchar(256)
    AS
    BEGIN
    MERGE [dbo].[Marketing] AS target
    USING @Marketing AS source
    ON (target.ProfileID = source.ProfileID and target.Category = @category)
    WHEN MATCHED THEN
        UPDATE SET State = source.State
    WHEN NOT MATCHED THEN
        INSERT (ProfileID, State, Category)
        VALUES (source.ProfileID, source.State, source.Category);
    END
    
  3. Nella pipeline definire la sezione sink di istanza gestita di SQL nell'attività di copia come indicato di seguito:

    "sink": {
        "type": "SqlMISink",
        "sqlWriterStoredProcedureName": "spOverwriteMarketing",
        "storedProcedureTableTypeParameterName": "Marketing",
        "sqlWriterTableType": "MarketingType",
        "storedProcedureParameters": {
            "category": {
                "value": "ProductA"
            }
        }
    }
    

Proprietà del flusso di dati per mapping

Quando si trasformano i dati nel flusso di dati di mapping, è possibile leggere e scrivere nelle tabelle da Istanza gestita di SQL di Azure. Per altre informazioni, vedere la trasformazione origine e la trasformazione sink nei flussi di dati per mapping.

Trasformazione origine

Nella tabella seguente sono elencate le proprietà supportate da Istanza gestita di SQL di Azure'origine. È possibile modificare queste proprietà nella scheda Opzioni origine.

Nome Descrizione Richiesto Valori consentiti Proprietà script flusso di dati
Tabella Se si seleziona Tabella come input, il flusso di dati recupera tutti i dati dalla tabella specificata nel set di dati. No - -
Query Se si seleziona Query come input, specificare una query SQL per recuperare i dati dall'origine, che esegue l'override di qualsiasi tabella specificata nel set di dati. L'uso delle query è un ottimo modo per ridurre le righe per i test o le ricerche.

La clausola Order By non è supportata, ma è possibile impostare un'istruzione FROM edizione Standard LECT completa. È possibile usare anche funzioni di tabella definite dall'utente. select * from udfGetData() è una funzione definita dall'utente in SQL che restituisce una tabella che è possibile usare nel flusso di dati.
Esempio di query: Select * from MyTable where customerId > 1000 and customerId < 2000
No String query
Dimensioni batch Specificare una dimensione batch per suddividere i dati di grandi dimensioni in letture. No Intero batchSize
Livello di isolamento Scegliere uno dei livelli di isolamento seguenti:
- Read Committed
- Read Uncommitted (impostazione predefinita)
- Lettura ripetibile
-Serializzabile
- Nessuno (ignora il livello di isolamento)
No READ_COMMITTED
READ_UNCOMMITTED
REPEATABLE_READ
SERIALIZABLE
NONE
isolationLevel
Abilitare l'estrazione incrementale Usare questa opzione per indicare ad ADF di elaborare solo le righe modificate dall'ultima esecuzione della pipeline. No - -
Colonna incrementale Quando si usa la funzionalità di estrazione incrementale, è necessario scegliere la colonna data/ora o numerica da usare come filigrana nella tabella di origine. No - -
Abilitare Change Data Capture nativo (anteprima) Usare questa opzione per indicare ad ADF di elaborare solo i dati differenziali acquisiti dalla tecnologia SQL Change Data Capture dall'ultima esecuzione della pipeline. Con questa opzione, i dati differenziali che includono inserimento di righe, aggiornamento ed eliminazione verranno caricati automaticamente senza alcuna colonna incrementale necessaria. È necessario abilitare Change Data Capture nell'istanza gestita di SQL di Azure prima di usare questa opzione in Azure Data Factory. Per altre informazioni su questa opzione in Azure Data Factory, vedere Change Data Capture nativo. No - -
Iniziare a leggere dall'inizio L'impostazione di questa opzione con l'estrazione incrementale indicherà a ADF di leggere tutte le righe alla prima esecuzione di una pipeline con l'estrazione incrementale attivata. No - -

Suggerimento

L'espressione di tabella comune (CTE) in SQL non è supportata nella modalità query del flusso di dati di mapping, perché il prerequisito dell'uso di questa modalità è che le query possono essere usate nella clausola FROM della query SQL, ma non è possibile eseguire questa operazione. Per usare le CTE, è necessario creare una stored procedure usando la query seguente:

CREATE PROC CTESP @query nvarchar(max)
AS
BEGIN
EXECUTE sp_executesql @query;
END

Usare quindi la modalità Stored procedure nella trasformazione di origine del flusso di dati di mapping e impostare l'esempio @querywith CTE as (select 'test' as a) select * from CTE. È quindi possibile usare le CTE come previsto.

Esempio di script di origine Istanza gestita di SQL di Azure

Quando si usa Istanza gestita di SQL di Azure come tipo di origine, lo script del flusso di dati associato è:

source(allowSchemaDrift: true,
    validateSchema: false,
    isolationLevel: 'READ_UNCOMMITTED',
    query: 'select * from MYTABLE',
    format: 'query') ~> SQLMISource

Trasformazione sink

Nella tabella seguente sono elencate le proprietà supportate da Istanza gestita di SQL di Azure sink. È possibile modificare queste proprietà nella scheda Opzioni sink.

Nome Descrizione Richiesto Valori consentiti Proprietà script flusso di dati
Metodo di aggiornamento Specificare le operazioni consentite nella destinazione del database. Per impostazione predefinita, sono consentiti solo gli inserimenti.
Per aggiornare, upsert o eliminare righe, è necessaria una trasformazione Alter row per contrassegnare le righe per tali azioni.
true oppure false deletable
Inseribile
Aggiornabile
aggiornabile
Colonne chiave Per gli aggiornamenti, gli upsert e le eliminazioni, le colonne chiave devono essere impostate per determinare quale riga modificare.
Il nome della colonna selezionato come chiave verrà usato come parte dell'aggiornamento successivo, dell'upsert, dell'eliminazione. Pertanto, è necessario selezionare una colonna esistente nel mapping sink.
No Matrice keys
Ignora scrittura colonne chiave Se si desidera non scrivere il valore nella colonna chiave, selezionare "Ignora la scrittura di colonne chiave". No true oppure false skipKeyWrites
azione Tabella determina se ricreare o rimuovere tutte le righe dalla tabella di destinazione prima della scrittura.
- Nessuno: nessuna azione verrà eseguita nella tabella.
- Ricrea: la tabella verrà eliminata e ricreata. Questa opzione è obbligatoria se si crea una nuova tabella in modo dinamico.
- Troncamento: tutte le righe della tabella di destinazione verranno rimosse.
No true oppure false Ricreare
truncate
Dimensioni batch Specificare il numero di righe scritte in ogni batch. Dimensioni batch più grandi migliorano l'ottimizzazione della compressione e della memoria, ma rischiano di causare eccezioni di memoria insufficiente durante la memorizzazione nella cache dei dati. No Intero batchSize
Pre e post-script SQL Specificare script SQL su più righe che verranno eseguiti prima (pre-elaborazione) e dopo la scrittura dei dati (post-elaborazione) nel database Sink. No String preSQLs
postSQLs

Suggerimento

  1. È consigliabile suddividere singoli script batch con più comandi in più batch.
  2. Possono essere eseguite come parte di un batch solo le istruzioni DDL (Data Definition Language) e DML (Data Manipulation Language) che restituiscono un semplice conteggio di aggiornamento. Per altre informazioni, vedere Esecuzione di operazioni batch

Esempio di script sink Istanza gestita di SQL di Azure

Quando si usa Istanza gestita di SQL di Azure come tipo di sink, lo script del flusso di dati associato è:

IncomingStream sink(allowSchemaDrift: true,
    validateSchema: false,
    deletable:false,
    insertable:true,
    updateable:true,
    upsertable:true,
    keys:['keyColumn'],
    format: 'table',
    skipDuplicateMapInputs: true,
    skipDuplicateMapOutputs: true) ~> SQLMISink

Proprietà dell'attività Lookup

Per altre informazioni sulle proprietà, vedere Attività Lookup.

Proprietà dell'attività GetMetadata

Per altre informazioni sulle proprietà, vedere Attività GetMetadata

Mapping dei tipi di dati per Istanza gestita di SQL

Quando i dati vengono copiati da e verso Istanza gestita di SQL usando l'attività di copia, i mapping seguenti vengono usati dai tipi di dati Istanza gestita di SQL ai tipi di dati provvisori usati internamente all'interno del servizio. Per informazioni su come l'attività di copia esegue il mapping dello schema e del tipo di dati di origine al sink, vedere Mapping dello schema e del tipo di dati.

Istanza gestita di SQL tipo di dati Tipo di dati del servizio provvisorio
bigint Int64
binary Byte[]
bit Booleano
char String, Char[]
data DataOra
Datetime DataOra
datetime2 Data/Ora
Datetimeoffset DateTimeOffset
Decimale Decimale
FILESTREAM attribute (varbinary(max)) Byte[]
Float Double
image Byte[]
int Int32
money Decimale
nchar String, Char[]
ntext String, Char[]
numeric Decimale
nvarchar String, Char[]
real Singola
rowversion Byte[]
smalldatetime Data/Ora
smallint Int16
smallmoney Decimale
sql_variant Object
Testo String, Char[]
Ora TimeSpan
timestamp Byte[]
tinyint Int16
uniqueidentifier GUID
varbinary Byte[]
varchar String, Char[]
xml String

Nota

Per i tipi di dati mappati al tipo provvisorio Decimal, attualmente attività Copy supporta la precisione fino a 28. Se si hanno dati che richiedono una precisione maggiore di 28, è consigliabile convertirli in una stringa in una query SQL.

Uso di Always Encrypted

Quando si copiano dati da/a Istanza gestita di SQL con Always Encrypted, seguire questa procedura:

  1. Archiviare la chiave master della colonna in un insieme di credenziali delle chiavi di Azure. Altre informazioni su come configurare Always Encrypted con Azure Key Vault

  2. Assicurarsi di avere accesso ottimale all'insieme di credenziali delle chiavi in cui è archiviata la chiave master della colonna. Per le autorizzazioni necessarie, vedere questo articolo .

  3. Creare un servizio collegato per connettersi al database SQL e abilitare la funzione "Always Encrypted" usando l'identità gestita o l'entità servizio.

Nota

Istanza gestita di SQL Always Encrypted supporta gli scenari seguenti:

  1. Gli archivi dati di origine o sink usano l'identità gestita o l'entità servizio come tipo di autenticazione del provider di chiavi.
  2. Gli archivi dati di origine e sink usano l'identità gestita come tipo di autenticazione del provider di chiavi.
  3. Gli archivi dati di origine e sink usano la stessa entità servizio del tipo di autenticazione del provider di chiavi.

Nota

Attualmente, Istanza gestita di SQL Always Encrypted è supportato solo per la trasformazione dell'origine nei flussi di dati di mapping.

Acquisizione dei dati delle modifiche nativa

Azure Data Factory può supportare funzionalità native di Change Data Capture per SQL Server, il database SQL di Azure e l'istanza gestita di SQL di Azure. I dati modificati, inclusi inserimento di righe, aggiornamento ed eliminazione negli archivi SQL, possono essere rilevati ed estratti automaticamente dal flusso di dati di mapping di Azure Data Factory. Senza esperienza di codice nel flusso di dati di mapping, gli utenti possono ottenere facilmente uno scenario di replica dei dati dagli archivi SQL aggiungendo un database come archivio di destinazione. Inoltre, gli utenti possono anche comporre qualsiasi logica di trasformazione dei dati tra per ottenere uno scenario ETL incrementale dagli archivi SQL.

Assicurarsi di mantenere invariato il nome della pipeline e dell'attività, in modo che il checkpoint possa essere registrato da ADF per ottenere i dati modificati dall'ultima esecuzione automaticamente. Se si modifica il nome della pipeline o il nome dell'attività, il checkpoint verrà reimpostato, che consente di iniziare dall'inizio o ottenere modifiche da ora nell'esecuzione successiva. Se si vuole modificare il nome della pipeline o il nome dell'attività, ma mantenere comunque il checkpoint per ottenere i dati modificati dall'ultima esecuzione automaticamente, usare la propria chiave checkpoint nell'attività del flusso di dati per ottenere tale risultato.

Quando si esegue il debug della pipeline, questa funzionalità funziona allo stesso modo. Tenere presente che il checkpoint verrà reimpostato quando si aggiorna il browser durante l'esecuzione del debug. Dopo aver soddisfatto il risultato della pipeline dall'esecuzione di debug, è possibile procedere alla pubblicazione e all'attivazione della pipeline. Al momento della prima attivazione della pipeline pubblicata, la pipeline viene riavviata automaticamente dall'inizio o ottiene le modifiche da ora in poi.

Nella sezione di monitoraggio è sempre possibile eseguire di nuovo una pipeline. Quando si esegue questa operazione, i dati modificati vengono sempre acquisiti dal checkpoint precedente dell'esecuzione della pipeline selezionata.

Esempio 1:

Quando si concatena direttamente una trasformazione di origine a cui si fa riferimento al set di dati abilitato per SQL CDC con una trasformazione sink a cui si fa riferimento a un database in un flusso di dati di mapping, le modifiche apportate all'origine SQL verranno applicate automaticamente al database di destinazione, in modo da ottenere facilmente uno scenario di replica dei dati tra i database. È possibile usare il metodo di aggiornamento nella trasformazione sink per selezionare se si desidera consentire l'inserimento, consentire l'aggiornamento o consentire l'eliminazione nel database di destinazione. Lo script di esempio nel flusso di dati di mapping è il seguente.

source(output(
		id as integer,
		name as string
	),
	allowSchemaDrift: true,
	validateSchema: false,
	enableNativeCdc: true,
	netChanges: true,
	skipInitialLoad: false,
	isolationLevel: 'READ_UNCOMMITTED',
	format: 'table') ~> source1
source1 sink(allowSchemaDrift: true,
	validateSchema: false,
	deletable:true,
	insertable:true,
	updateable:true,
	upsertable:true,
	keys:['id'],
	format: 'table',
	skipDuplicateMapInputs: true,
	skipDuplicateMapOutputs: true,
	errorHandlingOption: 'stopOnFirstError') ~> sink1

Esempio 2:

Se si vuole abilitare lo scenario ETL anziché la replica dei dati tra database tramite SQL CDC, è possibile usare espressioni nel flusso di dati di mapping, tra cui isInsert(1), isUpdate(1) e isDelete(1) per distinguere le righe con tipi di operazione diversi. Di seguito è riportato uno degli script di esempio per il mapping del flusso di dati sulla derivazione di una colonna con il valore: 1 per indicare le righe inserite, 2 per indicare le righe aggiornate e 3 per indicare le righe eliminate per le trasformazioni downstream per elaborare i dati differenziali.

source(output(
		id as integer,
		name as string
	),
	allowSchemaDrift: true,
	validateSchema: false,
	enableNativeCdc: true,
	netChanges: true,
	skipInitialLoad: false,
	isolationLevel: 'READ_UNCOMMITTED',
	format: 'table') ~> source1
source1 derive(operationType = iif(isInsert(1), 1, iif(isUpdate(1), 2, 3))) ~> derivedColumn1
derivedColumn1 sink(allowSchemaDrift: true,
	validateSchema: false,
	skipDuplicateMapInputs: true,
	skipDuplicateMapOutputs: true) ~> sink1

Limitazione nota:

Per un elenco degli archivi dati supportati come origini e sink dall'attività di copia, vedere Archivi dati supportati.