<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Azure SQL | The .NET Blog</title><link>https://thedotnetblog.com/it/tags/azure-sql/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>it</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Wed, 03 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/it/tags/azure-sql/index.xml" rel="self" type="application/rss+xml"/><item><title>NL2SQL è la SQL Injection dell'Era Agentiva</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/nl2sql-agentic-sql-injection-mcp-server/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/nl2sql-agentic-sql-injection-mcp-server/</guid><description>Prima di lasciare che un agente interroghi il tuo database con il linguaggio naturale, leggi questo. NL2SQL sembra semplice finché non rifletti sulla completezza dello schema, l'indeterminismo e cosa risolve realmente SQL MCP Server.</description><content:encoded>&lt;p&gt;C&amp;rsquo;è una versione del discorso su NL2SQL che suona perfetta: gli utenti fanno domande in linguaggio naturale, gli agenti generano SQL, i dati tornano. Meno schermate, meno query, meno codice. Semplice.&lt;/p&gt;
&lt;p&gt;Poi ci pensi per altri cinque minuti.&lt;/p&gt;
&lt;h2 id="i-problemi-di-cui-nessuno-parla-nella-demo"&gt;I Problemi di cui Nessuno Parla nella Demo&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Gli schemi non sono stati progettati per spiegare le cose.&lt;/strong&gt; Nomi di tabelle criptici, nomi di colonne incoerenti, relazioni tecnicamente valide ma semanticamente invalide senza predicati aggiuntivi — questo è normale per i database aziendali. Non sono bug, sono semplicemente la storia accumulata dei cambiamenti di business. Ma quando chiedi a un modello di inferire l&amp;rsquo;intento da uno schema che non è stato progettato per comunicare l&amp;rsquo;intento, il modello ci proverà comunque. Non si arrenderà. Genererà la sua migliore query possibile e restituirà risultati con sicurezza.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I modelli non sono deterministici.&lt;/strong&gt; Fai la stessa domanda sullo stesso database due volte e potresti ottenere SQL diverso. Il modello sta calcolando probabilità, e lievi variazioni nel contesto producono output diversi. Non puoi testare fino ad ottenere la garanzia che l&amp;rsquo;agente generi sempre la query corretta.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La revisione dell&amp;rsquo;utente non scala.&lt;/strong&gt; &amp;ldquo;Basta rivedere ogni query prima dell&amp;rsquo;esecuzione&amp;rdquo; sembra sicuro. Ma presuppone che gli utenti siano esperti sia nel modello di dati che in SQL — esattamente le persone che non avevano bisogno dell&amp;rsquo;interfaccia in linguaggio naturale. Introduce anche sovraccarico cognitivo e una nuova classe di bias di conferma, dove gli utenti sopraffatti dalla complessità della query approvano query non valide invece di investigarle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E poi c&amp;rsquo;è l&amp;rsquo;injection.&lt;/strong&gt; Nello sviluppo SQL tradizionale, la parametrizzazione ha risolto l&amp;rsquo;injection perché l&amp;rsquo;input dell&amp;rsquo;utente riempiva i parametri, non la struttura SQL. Con NL2SQL, il modello genera il SQL stesso. Il prompt, il contesto dello schema, la cronologia della conversazione e i dati recuperati influenzano tutti ciò che viene eseguito. Se qualcuno elabora un prompt che cambia ciò che il modello genera, questa è injection — non a livello di parametro, ma a livello di generazione di query. E a differenza dell&amp;rsquo;eliminazione di una tabella (ovvio, recuperabile), l&amp;rsquo;injection NL2SQL produce query che restituiscono risultati errati senza errori visibili. Le decisioni aziendali vengono prese su dati sbagliati.&lt;/p&gt;
&lt;h2 id="cosa-risolve-realmente-sql-mcp-server"&gt;Cosa Risolve Realmente SQL MCP Server&lt;/h2&gt;
&lt;p&gt;È qui che l&amp;rsquo;articolo fa il suo punto pratico più utile. Invece di dare a un agente accesso arbitrario allo schema e sperare nel meglio, SQL MCP Server espone una &lt;strong&gt;superficie API curata&lt;/strong&gt; costruita su &lt;a href="https://learn.microsoft.com/en-us/azure/data-api-builder/overview"&gt;Data API builder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La differenza è importante: l&amp;rsquo;agente non genera SQL. Chiama endpoint denominati che restituiscono forme di risultato predefinite. Il SQL viene scritto una volta, da uno sviluppatore, ed è deterministico. Il non-determinismo dell&amp;rsquo;agente è limitato alla scelta di &lt;em&gt;quale&lt;/em&gt; endpoint chiamare, non alla costruzione di query arbitrarie.&lt;/p&gt;
&lt;p&gt;Questo è analogo a ciò che la parametrizzazione ha fatto per l&amp;rsquo;injection SQL nel modello di app tradizionale — rimuovi la capacità di costruire query arbitrarie dall&amp;rsquo;input non attendibile.&lt;/p&gt;
&lt;h2 id="la-domanda-giusta"&gt;La Domanda Giusta&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;articolo non dice &amp;ldquo;non usare mai NL2SQL.&amp;rdquo; Dice: sii deliberato su &lt;em&gt;dove&lt;/em&gt; lo applichi e &lt;em&gt;cosa&lt;/em&gt; esponi. Per l&amp;rsquo;analisi esplorativa in un ambiente controllato, con uno schema limitato e accesso in sola lettura, NL2SQL potrebbe andare bene. Per i sistemi di produzione dove le decisioni aziendali dipendono dai risultati, un livello API curato è significativamente più sicuro.&lt;/p&gt;
&lt;p&gt;Onestà: alcuni problemi si risolvono genuinamente meglio con query strutturate dietro endpoint denominati che con il linguaggio naturale verso SQL. SQL MCP Server ti dà questa opzione senza abbandonare completamente l&amp;rsquo;interfaccia agentiva.&lt;/p&gt;
&lt;p&gt;Post originale: &lt;a href="https://devblogs.microsoft.com/azure-sql/sql-mcp-server-nl2sql/"&gt;Considering NL2SQL? Should your database really be the prompt? How can SQL MCP Server help?&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Azure SQL Può Ora Generare Embedding — In T-SQL Puro, Senza Livello Applicativo</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/azure-sql-ai-generate-embeddings-ga-rag-tsql/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/azure-sql-ai-generate-embeddings-ga-rag-tsql/</guid><description>AI_GENERATE_EMBEDDINGS e CREATE EXTERNAL MODEL sono ora in GA in Azure SQL Database e Managed Instance. Pipeline RAG costruite interamente in T-SQL, senza spostamento di dati richiesto.</description><content:encoded>&lt;p&gt;Se hai mai costruito una pipeline RAG, conosci la tassa della pipeline: i tuoi dati vivono in SQL, ma per generare embedding devi estrarli, chiamare un&amp;rsquo;API di embedding, gestire il batching e i limiti di velocità, e archiviare i risultati da qualche parte con ricerca vettoriale. Spesso in un database completamente diverso.&lt;/p&gt;
&lt;p&gt;Azure SQL ha appena eliminato la maggior parte di questo con due funzionalità ora generalmente disponibili: &lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt; e &lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="cosa-fanno"&gt;Cosa Fanno&lt;/h2&gt;
&lt;p&gt;Queste due funzionalità T-SQL lavorano come una pipeline integrata:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt;&lt;/strong&gt; — registra un endpoint di modello AI esterno come oggetto di database con nome. Imposti la posizione, il formato API, il tipo di modello e le credenziali una volta sola. Riutilizzalo ovunque.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt;&lt;/strong&gt; — una funzione T-SQL scalare che chiama il modello registrato e restituisce un array JSON di valori vettoriali. Funziona nelle istruzioni SELECT, INSERT, UPDATE e MERGE.&lt;/p&gt;
&lt;p&gt;Insieme formano una pipeline di embedding end-to-end senza lasciare il motore SQL.&lt;/p&gt;
&lt;h2 id="il-flusso-di-lavoro-completo"&gt;Il Flusso di Lavoro Completo&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Passo 1: Registra il tuo fornitore di embedding una volta
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;EXTERNAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MyEmbeddingModel&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WITH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;LOCATION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://your-aoai-resource.openai.azure.com/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;API_FORMAT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Azure OpenAI&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL_TYPE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EMBEDDINGS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;text-embedding-ada-002&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Passo 2: Genera embedding inline in T-SQL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AI_GENERATE_EMBEDDINGS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;USE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MyEmbeddingModel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Passo 3: Cerca con la distanza vettoriale
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TOP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;VECTOR_DISTANCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cosine&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AI_GENERATE_EMBEDDINGS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;USE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MyEmbeddingModel&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Questa è l&amp;rsquo;intera pipeline: dati in SQL, embedding generati in SQL, ricerca per similarità in SQL. Nessun livello di orchestrazione, nessun ETL, nessun database vettoriale separato.&lt;/p&gt;
&lt;h2 id="formati-api-e-opzioni-supportate"&gt;Formati API e Opzioni Supportate&lt;/h2&gt;
&lt;p&gt;In GA, &lt;code&gt;API_FORMAT&lt;/code&gt; supporta &lt;strong&gt;Azure OpenAI&lt;/strong&gt; e &lt;strong&gt;OpenAI&lt;/strong&gt;. &lt;code&gt;MODEL_TYPE&lt;/code&gt; è bloccato su &lt;code&gt;EMBEDDINGS&lt;/code&gt; per ora. Il JSON &lt;code&gt;PARAMETERS&lt;/code&gt; consente di impostare valori predefiniti a livello di modello incluso il conteggio dei tentativi:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;PARAMETERS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&amp;#34;sql_rest_options&amp;#34;:{&amp;#34;retry_count&amp;#34;:3}}&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;L&amp;rsquo;autenticazione usa le credenziali del database, quindi i segreti rimangono fuori dal codice dell&amp;rsquo;applicazione.&lt;/p&gt;
&lt;h2 id="cosa-questo-abilita-per-le-applicazioni-net"&gt;Cosa Questo Abilita per le Applicazioni .NET&lt;/h2&gt;
&lt;p&gt;Per gli sviluppatori .NET che costruiscono funzionalità AI su dati SQL esistenti, questo è significativo. Non hai bisogno di:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Estrarre dati in un archivio intermedio per gli embedding&lt;/li&gt;
&lt;li&gt;Gestire una pipeline di embedding esterna&lt;/li&gt;
&lt;li&gt;Configurare un database vettoriale separato (anche se puoi usare Azure AI Search se vuoi un archivio vettoriale completo)&lt;/li&gt;
&lt;li&gt;Modificare il livello di accesso ai dati della tua applicazione&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Puoi aggiungere la ricerca semantica alle applicazioni SQL esistenti in modo incrementale, usando gli stessi strumenti T-SQL che hai già.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;I pattern RAG sui dati SQL sono diventati drammaticamente più semplici. &lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt; + &lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt; significa che la tua applicazione SQL esistente può acquisire capacità di ricerca vettoriale senza aggiungere nuova infrastruttura.&lt;/p&gt;
&lt;p&gt;Entrambe le funzionalità sono in GA in Azure SQL Database e Azure SQL Managed Instance oggi.&lt;/p&gt;
&lt;p&gt;Post originale: &lt;a href="https://devblogs.microsoft.com/azure-sql/generate-embeddings-function-and-external-model-object-support-are-now-generally-available-in-azure-sql/"&gt;Generate Embeddings Function and External Model Object Support Are Now Generally Available in Azure SQL&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Azure Data Studio è stato ritirato: sposta il tuo flusso di Azure SQL su VS Code</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/azure-data-studio-retired-move-to-vscode-sql/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/azure-data-studio-retired-move-to-vscode-sql/</guid><description>Azure Data Studio è stato ritirato il 6 febbraio 2025, con supporto fino al 28 febbraio 2026. Ecco il percorso di migrazione completo verso VS Code con l'estensione MSSQL.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/azure-data-studio-retired-move-to-vscode-sql/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/azure-sql/azure-data-studio-is-retired-move-your-azure-sql-workflow-to-vs-code-in-10-minutes/"&gt;Azure Data Studio è stato ritirato il 6 febbraio 2025&lt;/a&gt;, con supporto fino al 28 febbraio 2026 — il sostituto consigliato è VS Code con l&amp;rsquo;estensione MSSQL.&lt;/p&gt;
&lt;h2 id="cosa-installare"&gt;Cosa installare&lt;/h2&gt;
&lt;p&gt;Tre elementi per iniziare:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Estensione MSSQL&lt;/strong&gt; — cerca &amp;ldquo;SQL Server (mssql)&amp;rdquo; nel Marketplace di VS Code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Estensione SQL Database Projects&lt;/strong&gt; — schema come codice, validazione della build, pubblicazione guidata&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.NET 8 SDK&lt;/strong&gt; — richiesto dal sistema di build; l&amp;rsquo;SDK mancante è il problema più comune al primo avvio&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="migrare-le-connessioni-e-le-impostazioni-di-ads"&gt;Migrare le connessioni e le impostazioni di ADS&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;estensione MSSQL include l&amp;rsquo;&lt;strong&gt;ADS Migration Toolkit&lt;/strong&gt;, che gestisce la migrazione una tantum in un flusso guidato: connessioni salvate, gruppi di connessioni, impostazioni e tasti di scelta rapida vengono importati automaticamente.&lt;/p&gt;
&lt;h2 id="ripristinare-la-memoria-muscolare-del-f5"&gt;Ripristinare la memoria muscolare del F5&lt;/h2&gt;
&lt;p&gt;Gli utenti di ADS si affidano a F5 per eseguire le query. Installa l&amp;rsquo;estensione &lt;strong&gt;MSSQL Database Management Keymap&lt;/strong&gt; per recuperare i tasti di scelta rapida in stile ADS, incluso F5.&lt;/p&gt;
&lt;h2 id="sql-database-projects-schema-come-codice"&gt;SQL Database Projects: schema come codice&lt;/h2&gt;
&lt;p&gt;Clic destro su un progetto → &lt;strong&gt;Pubblica&lt;/strong&gt; → configura la destinazione → rivedi lo script T-SQL generato → distribuisci. L&amp;rsquo;anteprima dello script prima del deployment è la funzionalità di sicurezza chiave. I modelli di elementi generano stub per tabelle, stored procedure e viste — lo stesso flusso di SSDT.&lt;/p&gt;
&lt;p&gt;Problema frequente: un&amp;rsquo;&lt;strong&gt;incompatibilità della piattaforma di destinazione&lt;/strong&gt; nel file &lt;code&gt;.sqlproj&lt;/code&gt; causerà errori di build se il progetto è stato creato per una versione diversa di SQL Server.&lt;/p&gt;
&lt;h2 id="schema-compare-e-schema-designer"&gt;Schema Compare e Schema Designer&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;estensione include anche &lt;strong&gt;Schema Compare&lt;/strong&gt; (differenza tra il progetto e il database distribuito) e &lt;strong&gt;Schema Designer&lt;/strong&gt; (modifica visuale dello schema senza scrivere DDL a mano).&lt;/p&gt;
&lt;h2 id="sviluppatori-di-microsoft-fabric"&gt;Sviluppatori di Microsoft Fabric&lt;/h2&gt;
&lt;p&gt;La configurazione è identica, ma inizia dal &lt;strong&gt;portale Fabric&lt;/strong&gt; e connetti prima il database a Git prima di aprirlo in VS Code. Microsoft ha una guida dedicata: &lt;em&gt;Azure Data Studio to VS Code — What it means for SQL database in Fabric developers&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="in-conclusione"&gt;In conclusione&lt;/h2&gt;
&lt;p&gt;La migrazione è un flusso guidato una tantum, non una ricostruzione manuale. Installa i tre strumenti, esegui l&amp;rsquo;ADS Migration Toolkit, ripristina i tuoi tasti di scelta rapida e sarai di nuovo operativo in meno di 10 minuti.&lt;/p&gt;
&lt;p&gt;Consulta l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/azure-sql/azure-data-studio-is-retired-move-your-azure-sql-workflow-to-vs-code-in-10-minutes/"&gt;articolo completo&lt;/a&gt; per screenshot passo-passo e la guida specifica per Fabric.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server su Azure App Service — Senza Container</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/</guid><description>Il SQL MCP Server ora può girare su Azure App Service senza Docker né Kubernetes. Cosa significa per gli sviluppatori .NET che costruiscono agenti AI che parlano con database SQL.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo articolo è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Diciamoci la verità: ogni volta che vedo &amp;ldquo;richiede un container&amp;rdquo; in un tutorial, una piccola parte di me sospira. I container sono fantastici — finché il tuo team non ha una strategia per i container, e improvvisamente una funzionalità che sembrava semplice è bloccata da complessità di orchestrazione che nessuno aveva pianificato.&lt;/p&gt;
&lt;p&gt;Ecco perché questo mi ha colpito. Il SQL MCP Server ora può girare su Azure App Service — senza Docker, senza Kubernetes, solo con la stessa configurazione di Data API Builder (DAB) che espone il tuo database SQL tramite MCP, REST e GraphQL.&lt;/p&gt;
&lt;h2 id="cosè-il-sql-mcp-server"&gt;Cos&amp;rsquo;è il SQL MCP Server?&lt;/h2&gt;
&lt;p&gt;Contesto rapido se non lo conosci ancora. Il SQL MCP Server si trova tra il tuo agente AI e il tuo database SQL. Invece di dare all&amp;rsquo;agente accesso diretto al database (un&amp;rsquo;idea pessima), espone le tue tabelle e view come uno strato di astrazione — entità con permessi definiti.&lt;/p&gt;
&lt;p&gt;È costruito su &lt;a href="https://learn.microsoft.com/it-it/azure/data-api-builder/"&gt;Data API Builder&lt;/a&gt;, il che significa che un singolo file di configurazione gestisce MCP &lt;em&gt;e&lt;/em&gt; REST &lt;em&gt;e&lt;/em&gt; GraphQL contemporaneamente. Il tuo agente parla con l&amp;rsquo;endpoint MCP. La tua applicazione tradizionale parla con REST o GraphQL. Stessa config, stesso runtime, superfici diverse.&lt;/p&gt;
&lt;p&gt;Questo è genuinamente utile. Non stai mantenendo due strati API separati.&lt;/p&gt;
&lt;h2 id="il-problema-del-container-e-la-soluzione"&gt;Il Problema del Container (e la Soluzione)&lt;/h2&gt;
&lt;p&gt;Il modello di deployment originale del SQL MCP Server usava i container. Funziona bene in molti team — ma non in tutti. Molti team .NET standardizzano su Azure App Service o VM. Richiedere un runtime di container solo per esporre un endpoint SQL aggiunge attrito che nessuno ha chiesto.&lt;/p&gt;
&lt;p&gt;Il nuovo walkthrough mostra come saltare completamente il container. Tutto funziona con un comando &lt;code&gt;dab start&lt;/code&gt;, ospitato su App Service come un processo web .NET 8 standard.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Installare Data API Builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet tool install microsoft.dataapibuilder --prerelease -g
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Inizializzare la configurazione&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab init --database-type mssql --host-mode Development --connection-string &lt;span class="s2"&gt;&amp;#34;@env(&amp;#39;SQL_CONNECTION_STRING&amp;#39;)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Aggiungere un&amp;#39;entità&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab add products --source dbo.products --permissions &lt;span class="s2"&gt;&amp;#34;authenticated:*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Configurare il provider di autenticazione App Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab configure --runtime.host.authentication.provider AppService
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Avviare il server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A questo punto hai MCP su &lt;code&gt;/mcp&lt;/code&gt;, REST e GraphQL dallo stesso processo, e niente che gira in un container.&lt;/p&gt;
&lt;h2 id="autenticazione-senza-chiavi-api-condivise"&gt;Autenticazione Senza Chiavi API Condivise&lt;/h2&gt;
&lt;p&gt;Questa è la parte che apprezzo di più. Quando fai il deploy su App Service, configuri Microsoft Entra ID come provider di autenticazione. Nessun segreto condiviso nei file di configurazione, nessuna chiave API da ruotare.&lt;/p&gt;
&lt;p&gt;La stringa di connessione rimane in una variabile d&amp;rsquo;ambiente di App Service (non in &lt;code&gt;dab-config.json&lt;/code&gt;), e l&amp;rsquo;endpoint MCP è protetto dall&amp;rsquo;autenticazione della piattaforma. Se sei già allineato con Entra ID nei tuoi workload Azure, questo si integra naturalmente.&lt;/p&gt;
&lt;p&gt;Per lo sviluppo locale, passi alla modalità &lt;code&gt;Simulator&lt;/code&gt; e al trasporto STDIO. Torni alla modalità &lt;code&gt;AppService&lt;/code&gt; prima del deployment. Pulito ed esplicito.&lt;/p&gt;
&lt;h2 id="deploy-su-app-service"&gt;Deploy su App Service&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az appservice plan create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;plan-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &amp;lt;resource-group&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --sku B1 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --is-linux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az webapp create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;app-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &amp;lt;resource-group&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --plan &amp;lt;plan-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --runtime &lt;span class="s2"&gt;&amp;#34;DOTNETCORE:8.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az webapp config &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;app-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &amp;lt;resource-group&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --startup-file &lt;span class="s2"&gt;&amp;#34;dab start&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Poi fai il deploy del tuo progetto DAB usando il metodo di deployment del codice che il tuo team già utilizza. Il dettaglio chiave: è un deployment di &lt;strong&gt;codice&lt;/strong&gt;, non di container.&lt;/p&gt;
&lt;h2 id="perché-importa-per-gli-sviluppatori-net"&gt;Perché Importa per gli Sviluppatori .NET&lt;/h2&gt;
&lt;p&gt;Se stai costruendo agenti AI in .NET, prima o poi il tuo agente dovrà comunicare con un database. Il SQL MCP Server ti dà un modo strutturato per farlo senza esporre stringhe di connessione grezze.&lt;/p&gt;
&lt;p&gt;Consulta il tutorial completo nel &lt;a href="https://devblogs.microsoft.com/azure-sql/sql-mcp-server-app-service/"&gt;post originale&lt;/a&gt; e il &lt;a href="https://github.com/Azure-Samples/SQL-MCP-NoContainer"&gt;repository di esempio su GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;Il SQL MCP Server su App Service è una solida opzione pragmatica per i team .NET che vogliono dare ai propri agenti accesso strutturato ai dati SQL senza una strategia di container. Provalo — i tuoi agenti apprezzeranno la superficie API pulita.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server — Il modo giusto per dare accesso ai database agli agenti AI</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</guid><description>SQL MCP Server di Data API builder offre agli agenti AI un accesso sicuro e deterministico ai database senza esporre schemi o affidarsi a NL2SQL. RBAC, cache, supporto multi-database — tutto integrato.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/sql-mcp-server-data-api-builder/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Siamo onesti: la maggior parte dei server MCP per database disponibili oggi sono spaventosi. Prendono una query in linguaggio naturale, generano SQL al volo e lo eseguono contro i tuoi dati di produzione. Cosa potrebbe andare storto? (Tutto. Tutto potrebbe andare storto.)&lt;/p&gt;
&lt;p&gt;Il team di Azure SQL ha appena &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;presentato SQL MCP Server&lt;/a&gt;, e adotta un approccio fondamentalmente diverso. Costruito come funzionalità di Data API builder (DAB) 2.0, dà agli agenti AI un accesso strutturato e deterministico alle operazioni sul database — senza NL2SQL, senza esporre il tuo schema, e con RBAC completo ad ogni passaggio.&lt;/p&gt;
&lt;h2 id="perché-non-nl2sql"&gt;Perché non NL2SQL?&lt;/h2&gt;
&lt;p&gt;Questa è la decisione di design più interessante. I modelli non sono deterministici, e le query complesse sono le più propense a produrre errori sottili. Le query esatte che gli utenti sperano che l&amp;rsquo;AI possa generare sono anche quelle che richiedono più scrutinio quando prodotte in modo non deterministico.&lt;/p&gt;
&lt;p&gt;Invece, SQL MCP Server usa un approccio &lt;strong&gt;NL2DAB&lt;/strong&gt;. L&amp;rsquo;agente lavora con il livello di astrazione delle entità di Data API builder e il suo query builder integrato per produrre T-SQL accurato e ben formato in modo deterministico. Stesso risultato per l&amp;rsquo;utente, ma senza il rischio di JOIN allucinati o esposizione accidentale di dati.&lt;/p&gt;
&lt;h2 id="sette-strumenti-non-settecento"&gt;Sette strumenti, non settecento&lt;/h2&gt;
&lt;p&gt;SQL MCP Server espone esattamente sette strumenti DML, indipendentemente dalle dimensioni del database:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;describe_entities&lt;/code&gt; — scoprire entità e operazioni disponibili&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create_record&lt;/code&gt; — inserire righe&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read_records&lt;/code&gt; — interrogare tabelle e viste&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update_record&lt;/code&gt; — modificare righe&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete_record&lt;/code&gt; — rimuovere righe&lt;/li&gt;
&lt;li&gt;&lt;code&gt;execute_entity&lt;/code&gt; — eseguire stored procedure&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aggregate_records&lt;/code&gt; — query di aggregazione&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Questo è intelligente perché le finestre di contesto sono lo spazio di pensiero dell&amp;rsquo;agente. Inondarle con centinaia di definizioni di strumenti lascia meno spazio per il ragionamento. Sette strumenti fissi mantengono l&amp;rsquo;agente concentrato sul &lt;em&gt;pensare&lt;/em&gt; piuttosto che sul &lt;em&gt;navigare&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ogni strumento può essere abilitato o disabilitato individualmente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;runtime&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;path&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;dml-tools&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;describe-entities&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;create-record&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;read-records&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;update-record&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;delete-record&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;execute-entity&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;aggregate-records&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="iniziare-in-tre-comandi"&gt;Iniziare in tre comandi&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab init &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --database-type mssql &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --connection-string &lt;span class="s2"&gt;&amp;#34;@env(&amp;#39;sql_connection_string&amp;#39;)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab add Customers &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --source dbo.Customers &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --permissions &lt;span class="s2"&gt;&amp;#34;anonymous:*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ecco un SQL MCP Server funzionante che espone la tua tabella Customers. Il livello di astrazione delle entità significa che puoi creare alias per nomi e colonne, limitare i campi per ruolo e controllare esattamente cosa vedono gli agenti — senza esporre dettagli interni dello schema.&lt;/p&gt;
&lt;h2 id="la-storia-della-sicurezza-è-solida"&gt;La storia della sicurezza è solida&lt;/h2&gt;
&lt;p&gt;Qui è dove la maturità di Data API builder ripaga:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RBAC ad ogni livello&lt;/strong&gt; — ogni entità definisce quali ruoli possono leggere, creare, aggiornare o eliminare, e quali campi sono visibili&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrazione con Azure Key Vault&lt;/strong&gt; — stringhe di connessione e segreti gestiti in modo sicuro&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Entra + OAuth personalizzato&lt;/strong&gt; — autenticazione di livello produzione&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content Security Policy&lt;/strong&gt; — gli agenti interagiscono attraverso un contratto controllato, non SQL grezzo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;astrazione dello schema è particolarmente importante. I nomi interni delle tue tabelle e colonne non vengono mai esposti all&amp;rsquo;agente. Definisci entità, alias e descrizioni che hanno senso per l&amp;rsquo;interazione AI — non il tuo diagramma ERD del database.&lt;/p&gt;
&lt;h2 id="multi-database-e-multi-protocollo"&gt;Multi-database e multi-protocollo&lt;/h2&gt;
&lt;p&gt;SQL MCP Server supporta Microsoft SQL, PostgreSQL, Azure Cosmos DB e MySQL. E poiché è una funzionalità di DAB, ottieni endpoint REST, GraphQL e MCP simultaneamente dalla stessa configurazione. Stesse definizioni di entità, stesse regole RBAC, stessa sicurezza — su tutti e tre i protocolli.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;auto-configurazione in DAB 2.0 può persino ispezionare il tuo database e costruire la configurazione dinamicamente, se sei a tuo agio con meno astrazione per la prototipazione rapida.&lt;/p&gt;
&lt;h2 id="la-mia-opinione"&gt;La mia opinione&lt;/h2&gt;
&lt;p&gt;Ecco come dovrebbe funzionare l&amp;rsquo;accesso aziendale ai database per gli agenti AI. Non &amp;ldquo;hey LLM, scrivimi un po&amp;rsquo; di SQL e YOLO sulla produzione.&amp;rdquo; Invece: un livello di entità ben definito, generazione deterministica delle query, RBAC ad ogni passaggio, caching, monitoraggio e telemetria. È noioso nel miglior modo possibile.&lt;/p&gt;
&lt;p&gt;Per gli sviluppatori .NET, la storia dell&amp;rsquo;integrazione è pulita — DAB è uno strumento .NET, l&amp;rsquo;MCP Server gira come container, e funziona con Azure SQL, che la maggior parte di noi sta già usando. Se stai costruendo agenti AI che hanno bisogno di accesso ai dati, inizia qui.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;SQL MCP Server è gratuito, open-source e gira ovunque. È l&amp;rsquo;approccio prescrittivo di Microsoft per dare agli agenti AI un accesso sicuro ai database. Consulta il &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;post completo&lt;/a&gt; e la &lt;a href="https://aka.ms/sql/mcp"&gt;documentazione&lt;/a&gt; per iniziare.&lt;/p&gt;</content:encoded></item></channel></rss>