Azure Function è un servizio di calcolo serverless offerto da Microsoft Azure che consente di eseguire codice senza dover gestire l'infrastruttura sottostante. I principali vantaggi di Azure Functions includono la scalabilità automatica, il pagamento in base all'uso e l'integrazione semplice con altri servizi Azure. Le estensioni semplificano lo sviluppo aggiungendo funzionalità preconfezionate, come il supporto per l'archiviazione o i webhook. I trigger sono eventi che avviano l'esecuzione di una funzione, consentendo l'elaborazione reattiva di dati o eventi.
Microsoft sta allargando sempre più i trigger disponibili nelle function adottando tutti i servizi che essa stessa mette a disposizione su Azure. Di recente è stata aggiunta la possibilità di utilizzare i SQL Trigger, cioè di monitorare delle tabelle e di invocare una funzione al cambiamento delle righe che contiene.
Per usufruire di questo trigger dobbiamo prima di tutto abilitare il change tracking sul database SQL e poi attivarlo sulle tabelle che vogliamo monitorare, come nell'esempio.
ALTER DATABASE ricciolo SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 1 DAYS, AUTO_CLEANUP = ON); ALTER TABLE [dbo].[Products] ENABLE CHANGE_TRACKING;
Poiché la function monitora i cambiamenti del database che vengono mantenuti dallo stesso, essi vanno memorizzati con un tempo massimo, per non ingrandire all'infinito lo spazio occupato. I due parametri CHANGE_RETENTION e AUTO_CLEANUP ci permettono di indicare per quanto tempo tenere gli eventi e se pulire automaticamente quelli passati. Se la function quindi è spenta per più di un giorno perderà i cambiamenti che successi nel mezzo.
A questo punto possiamo creare la function e utilizzare il trigger dedicato. Per farlo, in questo esempio, utilizziamo Visual Studio e C# con il wizard dedicato, come visibile nella figura seguente.

Otteniamo già configurato il seguente snippet di codice che aggancia il trigger e stampa l'oggetto ricevuto.
[Function("ProductsMonitoring")] public void Run( [SqlTrigger("[dbo].[products]", "db")] IReadOnlyList<SqlChange<Product>> changes, FunctionContext context) { _logger.LogInformation("SQL Changes: " + JsonSerializer.Serialize(changes)); }
Come possiamo vedere, il trigger si occupa di passare una lista di SqlChange tipizzata, cioè una lista contenente la proprietà Operation, per conoscere se è un inserimento, un aggiornamento o una cancellazione, e l'item, materializzato sulla base dell'intera riga. Dobbiamo quindi utilizzare un oggetto semplice dedicato con proprietà in lettura e scrittura.
Il trigger crea sul database una tabella con il prefisso az_func come supporto per conoscere e bloccare lo stato di gestione di ogni cambiamento. Ogni secondo monitora i cambiamenti e fa uso della tabella per poter inoltre e gestire i cambiamenti, eventualmente facendo più tentativi. Qualora nell'arco del secondo avvenissero più cambiamenti per una stessa riga, questi verranno visti dalla function come un unico cambiamento. Inoltre, il trigger effettua dei batch accorpando i cambiamenti così da ottimizzare le invocazioni alla funzione.
Questi parametri possono essere modificati attraverso il file host.json come documentato sul sito ufficiale https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-azure-sql-trigger?tabs=isolated-process%2Cportal&pivots=programming-language-csharp#optional-configuration
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Evitare il flickering dei componenti nel prerender di Blazor 8
Usare i servizi di Azure OpenAI e ChatGPT in ASP.NET Core con Semantic Kernel
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Estrarre dati randomici da una lista di oggetti in C#
Filtering sulle colonne in una QuickGrid di Blazor
Supportare il sorting di dati tabellari in Blazor con QuickGrid
Sfruttare GPT-4o realtime su Azure Open AI per conversazioni vocali
Implementare l'infinite scroll con QuickGrid in Blazor Server
Definire stili a livello di libreria in Angular
Supportare la sessione affinity di Azure App Service con Application Gateway
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Popolare una classe a partire dal testo, con Semantic Kernel e ASP.NET Core Web API