Modificare i dati nel database SQL di Azure con Funzioni di Azure
Funzioni di Azure è un servizio di calcolo serverless che consente di eseguire codice basato su eventi senza dover gestire l'infrastruttura. Questo codice è in grado di eseguire varie attività, ad esempio la trasformazione dei dati, la convalida, la registrazione e altro ancora.
Funzioni di Azure supporta più linguaggi di programmazione, rendendolo versatile per gli sviluppatori con set di competenze diverso. Si integrano perfettamente anche con GitHub Actions, consentendo il push automatico dei dati all'applicazione ogni volta che vengono apportate modifiche. Ciò garantisce che i dati siano sempre aggiornati e che i flussi di lavoro rimangano efficienti.
Funzioni di Azure supporta l'associazione di input, l'associazione di output e un trigger di funzione per i prodotti SQL di Azure e SQL Server.
A seconda della modalità di associazione in uso nell'app per le funzioni, sono disponibili estensioni da installare. Per altre informazioni, vedere Panoramica delle associazioni SQL di Azure per Funzioni di Azure.
Informazioni sulle associazioni SQL di Azure
Esistono due modalità consigliate per la creazione di una funzione C#.
- Il modello di lavoro isolato, ovvero una funzione compilata eseguita in un processo di lavoro isolato dal runtime. Questo modello supporta le funzioni C# in esecuzione sia nelle versioni LTS che non LTS di .NET e .NET Framework.
- Uno script C#, che viene usato principalmente durante la creazione di funzioni C# nel portale di Azure.
Importante
La modifica di app per le funzioni isolate .NET non è supportata nel portale di Azure. Usare l'ambiente di sviluppo locale per modificare l'app per le funzioni.
Creare un'app per le funzioni
Il primo passaggio consiste nel creare un'app per le funzioni. In questo esempio viene usato il portale di Azure, ma è anche possibile usare altri metodi, ad esempio Visual Studio Code o l'interfaccia della riga di comando di Azure.
Nel portale di Azure selezionare Crea una risorsa e quindi App per le funzioni. Scegliere il tipo di piano.
Immettere i dettagli necessari, ad esempio sottoscrizione, gruppo di risorse e nome dell'app per le funzioni.
Selezionare lo stack di runtime e la versione da usare.
Scegliere l'area e il sistema operativo per l'app per le funzioni.
Esaminare le impostazioni e selezionare Crea per distribuire l'app per le funzioni.
Aggiungere una stringa di connessione
È possibile aggiungere la stringa di connessione del database SQL di Azure nel menu a sinistra dell'app per le funzioni, nella sezione Impostazioni. Seleziona Variabili di ambiente. Nella scheda Stringhe di connessione selezionare + Aggiungi per aggiungere una nuova stringa di connessione. Specificare un nome, immettere il valore della stringa di connessione e selezionare il tipo SQLAzure.
Operazione di lettura dei dati (associazione di input)
La funzione funziona in modalità di associazione di input, ovvero quando la funzione viene eseguita, l'associazione di input SQL di Azure recupera i dati da un database e lo passa al parametro di input della funzione.
Leggere un singolo record da un database SQL di Azure
In questo esempio viene illustrato come creare una funzione di Azure in C# che recupera un singolo record da un database SQL di Azure. Questa funzione viene attivata da una richiesta HTTP, rendendola una soluzione pratica per gli scenari in cui è necessario recuperare dati specifici in base all'input dell'utente o ad altri parametri.
Il frammento di codice seguente mostra una funzione C# che recupera un singolo record dalla tabella Employee. La funzione viene attivata da una richiesta HTTP che usa una stringa di query per specificare EmployeeId. Il parametro di stringa di query fa distinzione tra maiuscole e minuscole.
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
namespace AzureSQLSamples
{
public static class GetEmployee
{
[FunctionName("GetEmployee")]
public static IActionResult Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "getemployee")]
HttpRequest req,
[Sql(commandText: "select [EmployeeId], [FirstName], [LastName], [Email], [Department] from dbo.Employee where EmployeeId = @EmployeeId",
commandType: System.Data.CommandType.Text,
parameters: "@EmployeeId={Query.EmployeeId}",
connectionStringSetting: "SqlConnectionString")]
IEnumerable employee)
{
return new OkObjectResult(employee.FirstOrDefault());
}
}
}
Convalidare la funzione
Per attivare e convalidare la funzione GetEmployee, è necessario inviare una richiesta HTTP GET all'endpoint della funzione con il EmployeeId specificato nella stringa di query. È possibile usare molti strumenti per inviare la richiesta HTTP GET, ad esempio un Web browser, Postman o cURL. Per usare un Web browser, immettere l'URL nella barra degli indirizzi del Web browser.
https://<your-function-app>.azurewebsites.net/api/getemployee?EmployeeId=123
Quando la funzione GetEmployee viene attivata da una richiesta HTTP GET, si verifica la sequenza di eventi seguente.
- L'associazione di input SQL di Azure recupera i dati dalla tabella
Employeenel database usando il valore EmployeeId specificato. - Il comando SQL recupera il record dalla tabella Employee corrispondente all'oggetto specificato
EmployeeId. - Il record recuperato viene passato alla funzione come raccolta
IEnumerabledenominata dipendente. - La funzione restituisce il primo record (e solo) dalla raccolta di dipendenti come
OkObjectResult, ovvero una risposta HTTP 200 contenente i dati dei dipendenti.
Operazioni di scrittura dei dati (associazione di output)
L'associazione di output SQL di Azure per Funzioni di Azure consente di scrivere dati in un database SQL di Azure.
Quando si usa l'associazione di output SQL di Azure, si definisce il comando SQL da eseguire, ad esempio un'istruzione INSERT, UPDATE o DELETE. L'associazione si occupa dell'esecuzione del comando SQL con i parametri forniti.
Scrivere un singolo record in un database SQL di Azure
Questo esempio di codice seguente definisce una funzione di Azure denominata AddEmployee che inserisce un nuovo record dipendente nella tabella Employee.
La funzione viene attivata da una richiesta HTTP POST e usa l'associazione di output SQL di Azure per inserire i dati nel database. La classe Employee rappresenta la struttura dei dati dei dipendenti e la classe OutputType viene usata per passare i dati del dipendente e la risposta HTTP al chiamante.
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Azure.Functions.Worker.Extensions.Sql;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace AzureSQL.Employee
{
public static class AddEmployee
{
// create a new Employee from body object
// uses output binding to insert new item into Employee table
[FunctionName("AddEmployee")]
public static async Task Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "AddEmployee")] HttpRequestData req,
FunctionContext executionContext)
{
var logger = executionContext.GetLogger("AddEmployee");
logger.LogInformation("C# HTTP trigger function processed a request.");
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
Employee employee = JsonConvert.DeserializeObject<Employee>(requestBody);
// generate a new id for the employee
employee.EmployeeId = Guid.NewGuid();
return new OutputType()
{
Employee = employee,
HttpResponse = req.CreateResponse(System.Net.HttpStatusCode.Created)
};
}
}
public class OutputType
{
[SqlOutput("dbo.Employee", connectionStringSetting: "SqlConnectionString")]
public Employee Employee { get; set; }
public HttpResponseData HttpResponse { get; set; }
}
public class Employee
{
public Guid EmployeeId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Department { get; set; }
}
}
Convalidare la funzione
Per attivare e convalidare la funzione AddEmployee, è necessario inviare una richiesta HTTP POST all'endpoint della funzione con i dati dei dipendenti nel corpo della richiesta. È possibile usare strumenti come Postman o cURL per inviare la richiesta HTTP POST. Ecco un esempio di utilizzo di Postman.
- Impostare il tipo di richiesta su POST.
- Immettere l'URL nella barra degli indirizzi:
https://<your-function-app-name>.azurewebsites.net/api/addemployee - Nella scheda Corpo selezionare non elaborato e impostare il formato su JSON.
- Immettere i dati dei dipendenti in formato JSON, ad esempio:
{ "FirstName": "John", "LastName": "Doe", "Email": "john.doe@example.com", "Department": "HR" }
Configurare un trigger SQL di Azure
Un trigger SQL di Azure è una funzionalità usata in Funzioni di Azure che attiva una funzione quando viene rilevata una modifica in una tabella SQL.
Il trigger usa il rilevamento delle modifiche SQL per rilevare le modifiche nella tabella monitorando e rispondendo in modo efficiente agli eventi INSERT, UPDATE e DELETE.
Opera su un ciclo di polling che verifica periodicamente la presenza di modifiche e attiva la funzione di conseguenza. Se vengono apportate più modifiche durante un intervallo di polling, queste modifiche vengono applicate dal trigger nell'ordine in cui sono state apportate originariamente le modifiche.
È possibile configurare l'impostazione Sql_Trigger_MaxBatchSize per controllare il numero di modifiche elaborate alla volta e l'impostazione Sql_Trigger_PollingIntervalMs per impostare il ritardo tra intervalli di polling.
Abilita rilevamento modifiche
Eseguire il comando di esempio seguente per abilitare il rilevamento delle modifiche nel database e nella tabella.
ALTER DATABASE [AdventureWorksLT]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);
ALTER TABLE [dbo].[Employee]
ENABLE CHANGE_TRACKING;
Creare una classe
Verrà ora definita una classe C# denominata Employee all'interno dello spazio dei nomi AzureSQL.Employee. La classe Employee rappresenta la struttura di un record dipendente.
namespace AzureSQL.Employee
{
public class Employee
{
public Guid EmployeeId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Department { get; set; }
}
}
Creare il trigger di funzione
Nella funzione di Azure configurare il trigger per rispondere alle modifiche rilevate dal rilevamento delle modifiche.
using System;
using System.Collections.Generic;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Sql;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace AzureSQL.Employee
{
public static class EmployeeTrigger
{
[Function("EmployeeTrigger")]
public static void Run(
[SqlTrigger("[dbo].[Employee]", "SqlConnectionString")]
IReadOnlyList<SqlChange<Employee>> changes,
FunctionContext context)
{
var logger = context.GetLogger("EmployeeTrigger");
foreach (SqlChange<Employee> change in changes)
{
Employee employee = change.Item;
logger.LogInformation($"Change operation: {change.Operation}");
logger.LogInformation($"EmployeeId: {employee.EmployeeId}, FirstName: {employee.FirstName}, LastName: {employee.LastName}, Email: {employee.Email}, Department: {employee.Department}");
}
}
}
}
Questa configurazione consente alla funzione di reagire alle modifiche dei dati quasi in tempo reale, rendendola utile per scenari come la sincronizzazione dei dati, il controllo e altro ancora.
Nota
Per altre informazioni sul funzionamento del rilevamento delle modifiche SQL, vedere Usare il rilevamento delle modifiche.
Monitorare l'esecuzione delle funzioni
Abilitare l'integrazione di Azure Application Insights per tenere traccia delle prestazioni della funzione e di eventuali potenziali problemi. Application Insights raccoglie i dati di log, prestazioni ed errori.