Usare Funzioni di Azure per connettersi al database SQL di Azure

Questo articolo illustra come usare Funzioni di Azure per creare un processo pianificato che si connette a un database Azure SQL o Istanza gestita di SQL di Azure. Il codice della funzione pulisce le righe in una tabella nel database. La nuova funzione C# viene creata in base a un modello di trigger timer predefinito in Visual Studio 2019. Per supportare questo scenario, è necessario anche impostare una stringa di connessione di database come impostazione app nell'app per le funzioni. Per Istanza gestita di SQL di Azure è necessario abilitare l'endpoint pubblico per poter connettersi da Funzioni di Azure. Questo scenario esegue un'operazione in blocco sul database.

Se si tratta della prima esperienza di utilizzo di funzioni C#, è consigliabile leggere la Guida di riferimento per gli sviluppatori C# di Funzioni di Azure.

Prerequisiti

  • Completare i passaggi descritti nell'articolo Creare la prima funzione usando Visual Studio per creare un'app per le funzioni locale destinata alla versione 2.x o successiva del runtime. È anche necessario aver pubblicato il progetto in un'app per le funzioni in Azure.

  • Questo articolo illustra un comando Transact-SQL che esegue un'operazione di pulizia in blocco nella tabella SalesOrderHeader nel database di esempio AdventureWorksLT. Per creare il database di esempio AdventureWorksLT, completare i passaggi descritti nell'articolo Creare un database in Azure SQL Database usando il portale di Azure.

  • È necessario aggiungere una regola del firewall a livello di server per l'indirizzo IP pubblico del computer usato per questa guida introduttiva. Questa regola è necessaria per poter accedere all'istanza di database SQL dal computer locale.

Ottenere informazioni di connessione

È necessario ottenere la stringa di connessione per il database creato al termine Creare un database in Azure SQL Database usando il portale di Azure.

  1. Accedere al portale di Azure.

  2. Scegliere Database SQL dal menu a sinistra, quindi scegliere il database nella pagina Database SQL.

  3. Selezionare Stringhe di connessione in Impostazioni e copiare la stringa di connessione ADO.NET completa. Per Istanza gestita di SQL di Azure copiare la stringa di connessione per l'endpoint pubblico.

    Copiare la stringa di connessione ADO.NET.

Impostare la stringa di connessione

Un'app per le funzioni ospita l'esecuzione delle funzioni in Azure. Come procedura consigliata per la sicurezza è opportuno archiviare le stringhe di connessione e altre informazioni riservate nelle impostazioni dell'app per le funzioni. L'uso delle impostazioni dell'applicazione impedisce la diffusione accidentale della stringa di connessione con il codice. È possibile accedere alle impostazioni dell'app per l'app per le funzioni direttamente da Visual Studio.

È necessario aver precedentemente pubblicato l'app in Azure. Se non è già stato fatto, pubblicare l'app per le funzioni in Azure.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto dell'app per le funzioni e scegliere Pubblica.

  2. Nella pagina Pubblica selezionare i puntini di sospensione (...) nell'area Hosting e scegliere Gestisci impostazioni Servizio app di Azure.

    Gestire le impostazioni di servizio app per l'app per le funzioni.

  3. In Impostazioni applicazione selezionare Aggiungi impostazione, in Nuovo tipo di sqldb_connectionnome impostazione app e selezionare OK.

    Aggiungere un'impostazione dell'app per la funzione.

  4. Nella nuova impostazione sqldb_connection incollare la stringa di connessione copiata nella sezione precedente nel campo Locale e sostituire i segnaposto {your_username} e {your_password} con valori reali. Selezionare Inserisci valore da locale per copiare il valore aggiornato nel campo Remoto e quindi selezionare OK.

    Aggiungere l'impostazione della stringa di connessione SQL.

    Le stringhe di connessione vengono archiviate crittografate in Azure (remoto). Per evitare perdite di segreti, è consigliabile escludere il file di progetto local.settings.json (locale) dal controllo del codice sorgente, ad esempio usando un file con estensione gitignore.

Aggiungere il pacchetto SqlClient al progetto

È necessario aggiungere il pacchetto NuGet che contiene la libreria SqlClient. Questa libreria di accesso ai dati è necessaria per connettersi a database SQL.

  1. Aprire il progetto dell'app per le funzioni locali in Visual Studio 2022.

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto di app per le funzioni e scegliere Gestisci pacchetti NuGet.

  3. Nella scheda Sfoglia cercare Microsoft.Data.SqlClient e, dopo averlo trovato, selezionarlo.

  4. Nella pagina Microsoft.Data.SqlClient selezionare versione 5.1.0 e quindi fare clic su Installa.

  5. Al termine dell'installazione, rivedere le modifiche e quindi fare clic su OK per chiudere la finestra Anteprima.

  6. Se viene visualizzata una finestra Accettazione della licenza fare clic su Accetto.

A questo punto, è possibile aggiungere il codice della funzione C# che si connette al database SQL.

Aggiungere una funzione attivata da un timer

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto dell'app per le funzioni e scegliere Aggiungi>nuova funzione di Azure.

  2. Con il modello Funzioni di Azure selezionato, assegnare al nuovo elemento un nome simile a DatabaseCleanup.cs e selezionare Aggiungi.

  3. Nella finestra di dialogo Nuova funzione di Azure scegliere Trigger timer e quindi Aggiungi. Questa finestra di dialogo crea un file di codice per la funzione attivata da timer.

  4. Aprire il nuovo file di codice e aggiungere le istruzioni using seguenti all'inizio del file:

    using Microsoft.Data.SqlClient;
    using System.Threading.Tasks;
    
  5. Sostituire la funzione Run esistente con il codice seguente:

    [FunctionName("DatabaseCleanup")]
    public static async Task Run([TimerTrigger("*/15 * * * * *")]TimerInfo myTimer, ILogger log)
    {
        // Get the connection string from app settings and use it to create a connection.
        var str = Environment.GetEnvironmentVariable("sqldb_connection");
        using (SqlConnection conn = new SqlConnection(str))
        {
            conn.Open();
            var text = "UPDATE SalesLT.SalesOrderHeader " +
                    "SET [Status] = 5  WHERE ShipDate < GetDate();";
    
            using (SqlCommand cmd = new SqlCommand(text, conn))
            {
                // Execute the command and log the # rows affected.
                var rows = await cmd.ExecuteNonQueryAsync();
                log.LogInformation($"{rows} rows were updated");
            }
        }
    }
    

    Questa funzione viene eseguita ogni 15 secondi per aggiornare la colonna Status in base alla data di spedizione. Per altre informazioni relative al trigger timer, vedere Trigger timer per Funzioni di Azure.

  6. Premere F5 per avviare l'app per le funzioni. Verrà visualizzata la finestra di esecuzione Strumenti di base di Funzioni di Azure in secondo piano rispetto a Visual Studio.

  7. 15 secondi dopo l'avvio, la funzione viene eseguita. Osservare l'output e notare il numero di righe aggiornate nella tabella SalesOrderHeader.

    Visualizzare i log di funzione.

    Alla prima esecuzione dovrebbero essere aggiornate 32 righe di dati. Le esecuzioni successive non aggiornano alcuna riga di dati, a meno che non si apportino modifiche ai dati della tabella SalesOrderHeader in modo che vengano selezionate altre righe dall'istruzione UPDATE.

Se si intende pubblicare questa funzione, ricordarsi di modificare l'attributo TimerTrigger specificando una pianificazione CRON più ragionevole rispetto a ogni 15 secondi. È anche necessario assicurarsi che l'app per le funzioni possa accedere al database Azure SQL o Istanza gestita di SQL di Azure. Per altre informazioni, vedere uno dei collegamenti seguenti in base al tipo di Azure SQL:

Passaggi successivi

Si vedrà ora come usare Funzioni con app per la logica per l'integrazione con altri servizi.

Per altre informazioni su Funzioni, vedere gli articoli seguenti: