<?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/fr/tags/azure-sql/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>fr</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/fr/tags/azure-sql/index.xml" rel="self" type="application/rss+xml"/><item><title>NL2SQL est l'injection SQL de l'ère agentique</title><link>https://thedotnetblog.com/fr/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/fr/news/emiliano-montesdeoca/nl2sql-agentic-sql-injection-mcp-server/</guid><description>Avant de laisser un agent interroger votre base de données en langage naturel, lisez ceci. NL2SQL semble simple jusqu'à ce que vous réfléchissiez à la complétude du schéma, à l'indéterminisme et à ce que SQL MCP Server résout vraiment.</description><content:encoded>&lt;p&gt;Il existe une version du discours NL2SQL qui semble parfaite : les utilisateurs posent des questions en langage naturel, les agents génèrent du SQL, les données reviennent. Moins d&amp;rsquo;écrans, moins de requêtes, moins de code. Simple.&lt;/p&gt;
&lt;p&gt;Puis vous y réfléchissez cinq minutes de plus.&lt;/p&gt;
&lt;h2 id="les-problèmes-dont-personne-ne-parle-dans-la-démo"&gt;Les problèmes dont personne ne parle dans la démo&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Les schémas n&amp;rsquo;ont pas été conçus pour expliquer les choses.&lt;/strong&gt; Noms de tables cryptiques, noms de colonnes incohérents, relations techniquement valides mais sémantiquement invalides sans prédicats supplémentaires — c&amp;rsquo;est normal dans les bases de données d&amp;rsquo;entreprise. Ce ne sont pas des bugs, c&amp;rsquo;est simplement l&amp;rsquo;histoire accumulée des changements métier. Mais quand vous demandez à un modèle d&amp;rsquo;inférer l&amp;rsquo;intention d&amp;rsquo;un schéma qui n&amp;rsquo;a pas été conçu pour communiquer l&amp;rsquo;intention, le modèle essaiera quand même. Il ne s&amp;rsquo;arrêtera pas. Il générera sa meilleure requête et retournera des résultats avec assurance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les modèles ne sont pas déterministes.&lt;/strong&gt; Posez la même question sur la même base de données deux fois et vous pourriez obtenir du SQL différent. Le modèle calcule des probabilités, et de légères variations de contexte produisent des sorties différentes. Vous ne pouvez pas tester votre chemin vers une garantie que l&amp;rsquo;agent génère toujours la bonne requête.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La révision par l&amp;rsquo;utilisateur ne passe pas à l&amp;rsquo;échelle.&lt;/strong&gt; &amp;ldquo;Vérifiez simplement chaque requête avant l&amp;rsquo;exécution&amp;rdquo; semble sûr. Mais cela suppose que les utilisateurs sont des experts à la fois dans le modèle de données et en SQL — exactement les personnes qui n&amp;rsquo;avaient pas besoin de l&amp;rsquo;interface en langage naturel. Cela introduit également une surcharge cognitive et une nouvelle classe de biais de confirmation, où les utilisateurs submergés par la complexité des requêtes approuvent des requêtes invalides plutôt que de les investiguer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et puis il y a l&amp;rsquo;injection.&lt;/strong&gt; Dans le développement SQL traditionnel, la paramétrisation a résolu l&amp;rsquo;injection parce que la saisie utilisateur remplissait des paramètres, pas la structure SQL. Avec NL2SQL, le modèle génère le SQL lui-même. Le prompt, le contexte du schéma, l&amp;rsquo;historique de conversation et les données récupérées influencent tous ce qui est exécuté. Si quelqu&amp;rsquo;un élabore un prompt qui change ce que le modèle génère, c&amp;rsquo;est de l&amp;rsquo;injection — pas au niveau des paramètres, mais au niveau de la génération des requêtes. Et contrairement à la suppression d&amp;rsquo;une table (évident, récupérable), l&amp;rsquo;injection NL2SQL produit des requêtes qui retournent des résultats incorrects sans aucune erreur visible. Des décisions métier sont prises sur de mauvaises données.&lt;/p&gt;
&lt;h2 id="ce-que-sql-mcp-server-résout-réellement"&gt;Ce que SQL MCP Server résout réellement&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est là que l&amp;rsquo;article fait son point pratique le plus utile. Plutôt que de donner à un agent un accès arbitraire au schéma et d&amp;rsquo;espérer le meilleur, SQL MCP Server expose une &lt;strong&gt;surface API organisée&lt;/strong&gt; construite sur &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 différence est importante : l&amp;rsquo;agent ne génère pas de SQL. Il appelle des endpoints nommés qui retournent des formes de résultat prédéfinies. Le SQL est écrit une fois, par un développeur, et est déterministe. Le non-déterminisme de l&amp;rsquo;agent se limite à choisir &lt;em&gt;quel&lt;/em&gt; endpoint appeler, pas à construire des requêtes arbitraires.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est analogue à ce que la paramétrisation a fait pour l&amp;rsquo;injection SQL dans le modèle d&amp;rsquo;application traditionnel — vous supprimez la capacité de construire des requêtes arbitraires à partir d&amp;rsquo;entrées non fiables.&lt;/p&gt;
&lt;h2 id="la-bonne-question"&gt;La bonne question&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;article ne dit pas &amp;ldquo;n&amp;rsquo;utilisez jamais NL2SQL.&amp;rdquo; Il dit : soyez délibéré sur &lt;em&gt;où&lt;/em&gt; vous l&amp;rsquo;appliquez et &lt;em&gt;ce que&lt;/em&gt; vous exposez. Pour une analyse exploratoire dans un environnement contrôlé, avec un schéma limité et un accès en lecture seule, NL2SQL pourrait convenir. Pour les systèmes de production où les décisions métier dépendent des résultats, une couche API organisée est significativement plus sûre.&lt;/p&gt;
&lt;p&gt;Honnêteté : certains problèmes sont vraiment mieux résolus avec des requêtes structurées derrière des endpoints nommés qu&amp;rsquo;avec du langage naturel vers SQL. SQL MCP Server vous donne cette option sans abandonner entièrement l&amp;rsquo;interface agentique.&lt;/p&gt;
&lt;p&gt;Publication 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 Peut Maintenant Générer des Embeddings — En T-SQL Pur, Sans Couche Applicative</title><link>https://thedotnetblog.com/fr/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/fr/news/emiliano-montesdeoca/azure-sql-ai-generate-embeddings-ga-rag-tsql/</guid><description>AI_GENERATE_EMBEDDINGS et CREATE EXTERNAL MODEL sont maintenant en GA dans Azure SQL Database et Managed Instance. Des pipelines RAG entièrement construits en T-SQL, sans déplacement de données requis.</description><content:encoded>&lt;p&gt;Si vous avez déjà construit un pipeline RAG, vous connaissez la taxe pipeline : vos données vivent dans SQL, mais pour générer des embeddings vous devez les extraire, appeler une API d&amp;rsquo;embeddings, gérer le traitement par lots et les limites de débit, et stocker les résultats quelque part avec une recherche vectorielle. Souvent dans une base de données entièrement différente.&lt;/p&gt;
&lt;p&gt;Azure SQL vient d&amp;rsquo;éliminer la majeure partie de cela avec deux fonctionnalités désormais généralement disponibles : &lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt; et &lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="ce-quelles-font"&gt;Ce Qu&amp;rsquo;elles Font&lt;/h2&gt;
&lt;p&gt;Ces deux fonctionnalités T-SQL fonctionnent comme un pipeline intégré :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt;&lt;/strong&gt; — enregistre un endpoint de modèle d&amp;rsquo;IA externe comme un objet de base de données nommé. Vous définissez l&amp;rsquo;emplacement, le format d&amp;rsquo;API, le type de modèle et les identifiants une seule fois. Réutilisez-les partout.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt;&lt;/strong&gt; — une fonction T-SQL scalaire qui appelle le modèle enregistré et renvoie un tableau JSON de valeurs vectorielles. Fonctionne dans les instructions SELECT, INSERT, UPDATE et MERGE.&lt;/p&gt;
&lt;p&gt;Ensemble, ils forment un pipeline d&amp;rsquo;embeddings de bout en bout sans quitter le moteur SQL.&lt;/p&gt;
&lt;h2 id="le-flux-de-travail-complet"&gt;Le Flux de Travail Complet&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;-- Étape 1 : Enregistrez votre fournisseur d&amp;#39;embeddings une fois
&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;-- Étape 2 : Générez des embeddings en ligne en 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;-- Étape 3 : Recherche avec la distance vectorielle
&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;C&amp;rsquo;est tout le pipeline : données dans SQL, embeddings générés dans SQL, recherche de similarité dans SQL. Pas de couche d&amp;rsquo;orchestration, pas d&amp;rsquo;ETL, pas de base de données vectorielle séparée.&lt;/p&gt;
&lt;h2 id="formats-dapi-et-options-supportés"&gt;Formats d&amp;rsquo;API et Options Supportés&lt;/h2&gt;
&lt;p&gt;En GA, &lt;code&gt;API_FORMAT&lt;/code&gt; supporte &lt;strong&gt;Azure OpenAI&lt;/strong&gt; et &lt;strong&gt;OpenAI&lt;/strong&gt;. &lt;code&gt;MODEL_TYPE&lt;/code&gt; est verrouillé sur &lt;code&gt;EMBEDDINGS&lt;/code&gt; pour l&amp;rsquo;instant. Le JSON &lt;code&gt;PARAMETERS&lt;/code&gt; vous permet de définir des valeurs par défaut au niveau du modèle, notamment le nombre de tentatives :&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;authentification utilise les identifiants de la base de données, donc les secrets restent hors de votre code applicatif.&lt;/p&gt;
&lt;h2 id="ce-que-cela-permet-pour-les-applications-net"&gt;Ce Que Cela Permet pour les Applications .NET&lt;/h2&gt;
&lt;p&gt;Pour les développeurs .NET qui construisent des fonctionnalités d&amp;rsquo;IA sur des données SQL existantes, c&amp;rsquo;est significatif. Vous n&amp;rsquo;avez pas besoin de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extraire des données vers un magasin intermédiaire pour les embeddings&lt;/li&gt;
&lt;li&gt;Gérer un pipeline d&amp;rsquo;embeddings externe&lt;/li&gt;
&lt;li&gt;Configurer une base de données vectorielle séparée (bien que vous puissiez utiliser Azure AI Search si vous voulez un magasin vectoriel complet)&lt;/li&gt;
&lt;li&gt;Modifier la couche d&amp;rsquo;accès aux données de votre application&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vous pouvez ajouter la recherche sémantique aux applications SQL existantes de manière incrémentale, en utilisant les mêmes outils T-SQL que vous avez déjà.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Les patterns RAG sur les données SQL sont devenus dramatiquement plus simples. &lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt; + &lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt; signifie que votre application SQL existante peut acquérir des capacités de recherche vectorielle sans ajouter de nouvelle infrastructure.&lt;/p&gt;
&lt;p&gt;Les deux fonctionnalités sont en GA dans Azure SQL Database et Azure SQL Managed Instance aujourd&amp;rsquo;hui.&lt;/p&gt;
&lt;p&gt;Post original : &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 est retraité : migrez votre flux Azure SQL vers VS Code</title><link>https://thedotnetblog.com/fr/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/fr/news/emiliano-montesdeoca/azure-data-studio-retired-move-to-vscode-sql/</guid><description>Azure Data Studio a été retraité le 6 février 2025, le support se termine le 28 février 2026. Voici le chemin de migration complet vers VS Code avec l'extension MSSQL.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ce post a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/news/emiliano-montesdeoca/azure-data-studio-retired-move-to-vscode-sql/"&gt;cliquez ici&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 a été retraité le 6 février 2025&lt;/a&gt;, le support se termine le 28 février 2026 — le remplacement recommandé est VS Code avec l&amp;rsquo;extension MSSQL.&lt;/p&gt;
&lt;h2 id="ce-quil-faut-installer"&gt;Ce qu&amp;rsquo;il faut installer&lt;/h2&gt;
&lt;p&gt;Trois éléments pour commencer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Extension MSSQL&lt;/strong&gt; — cherchez « SQL Server (mssql) » dans le Marketplace VS Code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extension SQL Database Projects&lt;/strong&gt; — schéma en tant que code, validation de build, publication guidée&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.NET 8 SDK&lt;/strong&gt; — requis par le système de build ; SDK manquant est le problème le plus fréquent au premier démarrage&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="migrer-vos-connexions-et-paramètres-ads"&gt;Migrer vos connexions et paramètres ADS&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;extension MSSQL inclut l&amp;rsquo;&lt;strong&gt;ADS Migration Toolkit&lt;/strong&gt;, qui gère la migration unique dans un flux guidé : connexions enregistrées, groupes de connexions, paramètres et raccourcis clavier sont tous importés automatiquement.&lt;/p&gt;
&lt;h2 id="retrouver-le-réflexe-f5"&gt;Retrouver le réflexe F5&lt;/h2&gt;
&lt;p&gt;Les utilisateurs d&amp;rsquo;ADS utilisent F5 pour exécuter des requêtes. Installez l&amp;rsquo;extension &lt;strong&gt;MSSQL Database Management Keymap&lt;/strong&gt; pour retrouver les raccourcis clavier de type ADS, y compris F5.&lt;/p&gt;
&lt;h2 id="sql-database-projects--schéma-en-tant-que-code"&gt;SQL Database Projects : schéma en tant que code&lt;/h2&gt;
&lt;p&gt;Clic droit sur un projet → &lt;strong&gt;Publier&lt;/strong&gt; → configurer la cible → examiner le script T-SQL généré → déployer. La prévisualisation du script avant le déploiement est la fonctionnalité de sécurité clé. Les modèles d&amp;rsquo;éléments génèrent des stubs pour les tables, procédures stockées et vues — le même flux de travail que SSDT.&lt;/p&gt;
&lt;p&gt;Problème courant : une &lt;strong&gt;incompatibilité de plateforme cible&lt;/strong&gt; dans le fichier &lt;code&gt;.sqlproj&lt;/code&gt; provoquera des erreurs de build si le projet a été créé pour une version différente de SQL Server.&lt;/p&gt;
&lt;h2 id="schema-compare-et-schema-designer"&gt;Schema Compare et Schema Designer&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;extension inclut également &lt;strong&gt;Schema Compare&lt;/strong&gt; (diff entre votre projet et la base de données déployée) et &lt;strong&gt;Schema Designer&lt;/strong&gt; (édition visuelle du schéma sans écrire du DDL à la main).&lt;/p&gt;
&lt;h2 id="développeurs-microsoft-fabric"&gt;Développeurs Microsoft Fabric&lt;/h2&gt;
&lt;p&gt;La configuration est identique, mais commencez depuis le &lt;strong&gt;portail Fabric&lt;/strong&gt; et connectez la base de données à Git avant de l&amp;rsquo;ouvrir dans VS Code. Microsoft dispose d&amp;rsquo;un guide dédié : &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="en-résumé"&gt;En résumé&lt;/h2&gt;
&lt;p&gt;La migration est un flux guidé en une seule fois, pas une reconstruction manuelle. Installez les trois outils, exécutez l&amp;rsquo;ADS Migration Toolkit, restaurez vos raccourcis clavier, et vous êtes de retour à la normale en moins de 10 minutes.&lt;/p&gt;
&lt;p&gt;Consultez 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;article complet&lt;/a&gt; pour les captures d&amp;rsquo;écran étape par étape et le tutoriel spécifique à Fabric.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server sur Azure App Service — Sans Conteneurs</title><link>https://thedotnetblog.com/fr/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/fr/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/</guid><description>Le SQL MCP Server peut désormais s'exécuter sur Azure App Service sans Docker ni Kubernetes. Voici ce que cela signifie pour les développeurs .NET qui construisent des agents IA communiquant avec des bases de données SQL.</description><content:encoded>&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Soyons honnêtes : chaque fois que je lis &amp;ldquo;nécessite un conteneur&amp;rdquo; dans un tutoriel, une petite partie de moi soupire. Les conteneurs sont formidables — jusqu&amp;rsquo;à ce que ton équipe n&amp;rsquo;ait pas de stratégie de conteneurs, et soudain une fonctionnalité qui semblait simple se retrouve bloquée par une complexité d&amp;rsquo;orchestration que personne n&amp;rsquo;avait anticipée.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est pourquoi celui-ci a retenu mon attention. Le SQL MCP Server peut désormais s&amp;rsquo;exécuter sur Azure App Service — sans Docker, sans Kubernetes, juste avec la même configuration Data API Builder (DAB) qui expose ta base de données SQL via MCP, REST et GraphQL.&lt;/p&gt;
&lt;h2 id="quest-ce-que-le-sql-mcp-server-"&gt;Qu&amp;rsquo;est-ce que le SQL MCP Server ?&lt;/h2&gt;
&lt;p&gt;Contexte rapide si tu ne le connais pas encore. Le SQL MCP Server se place entre ton agent IA et ta base de données SQL. Au lieu de donner à ton agent un accès direct à la base de données (une très mauvaise idée), il expose tes tables et vues comme une couche d&amp;rsquo;abstraction — des entités avec des permissions définies.&lt;/p&gt;
&lt;p&gt;Il est construit sur &lt;a href="https://learn.microsoft.com/fr-fr/azure/data-api-builder/"&gt;Data API Builder&lt;/a&gt;, ce qui signifie qu&amp;rsquo;un seul fichier de configuration gère MCP &lt;em&gt;et&lt;/em&gt; REST &lt;em&gt;et&lt;/em&gt; GraphQL simultanément. Ton agent parle à l&amp;rsquo;endpoint MCP. Ton application traditionnelle parle à REST ou GraphQL. Même config, même runtime, surfaces différentes.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est vraiment utile. Tu ne maintiens pas deux couches d&amp;rsquo;API séparées.&lt;/p&gt;
&lt;h2 id="le-problème-des-conteneurs-et-la-solution"&gt;Le Problème des Conteneurs (et la Solution)&lt;/h2&gt;
&lt;p&gt;Le modèle de déploiement original du SQL MCP Server utilisait des conteneurs. Cela fonctionne bien dans beaucoup d&amp;rsquo;équipes — mais pas toutes. De nombreuses équipes .NET standardisent sur Azure App Service ou des VMs. Exiger un runtime de conteneur juste pour exposer un endpoint SQL ajoute de la friction que personne n&amp;rsquo;a demandée.&lt;/p&gt;
&lt;p&gt;Le nouveau guide montre comment contourner entièrement le conteneur. Tout fonctionne avec une commande &lt;code&gt;dab start&lt;/code&gt;, hébergé sur App Service comme un processus 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;# Installer 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;# Initialiser la configuration&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;# Ajouter une 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;# Configurer le fournisseur d&amp;#39;auth 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;# Démarrer le serveur&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;À ce stade, tu as MCP à &lt;code&gt;/mcp&lt;/code&gt;, REST et GraphQL depuis le même processus, et rien qui tourne dans un conteneur.&lt;/p&gt;
&lt;h2 id="authentification-sans-clés-dapi-partagées"&gt;Authentification Sans Clés d&amp;rsquo;API Partagées&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est la partie que j&amp;rsquo;apprécie le plus. Quand tu déploies sur App Service, tu configures Microsoft Entra ID comme fournisseur d&amp;rsquo;authentification. Pas de secrets partagés dans les fichiers de configuration, pas de clés d&amp;rsquo;API à faire tourner.&lt;/p&gt;
&lt;p&gt;La chaîne de connexion reste dans une variable d&amp;rsquo;environnement App Service (pas dans &lt;code&gt;dab-config.json&lt;/code&gt;), et l&amp;rsquo;endpoint MCP est protégé par l&amp;rsquo;authentification de la plateforme. Si tu es déjà aligné sur Entra ID pour tes charges de travail Azure, cela s&amp;rsquo;intègre naturellement.&lt;/p&gt;
&lt;p&gt;Pour le développement local, tu passes en mode &lt;code&gt;Simulator&lt;/code&gt; et transport STDIO. Tu reviens en mode &lt;code&gt;AppService&lt;/code&gt; avant le déploiement. Propre et explicite.&lt;/p&gt;
&lt;h2 id="déploiement-sur-app-service"&gt;Déploiement sur 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;Ensuite tu déploies ton projet DAB en utilisant la méthode de déploiement de code que ton équipe utilise déjà. Le détail clé : c&amp;rsquo;est un déploiement de &lt;strong&gt;code&lt;/strong&gt;, pas de conteneur.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-important-pour-les-développeurs-net"&gt;Pourquoi C&amp;rsquo;est Important pour les Développeurs .NET&lt;/h2&gt;
&lt;p&gt;Si tu construis des agents IA en .NET, ton agent devra tôt ou tard communiquer avec une base de données. Le SQL MCP Server te donne une façon structurée de le faire sans exposer des chaînes de connexion brutes.&lt;/p&gt;
&lt;p&gt;Consulte le guide complet dans le &lt;a href="https://devblogs.microsoft.com/azure-sql/sql-mcp-server-app-service/"&gt;billet original&lt;/a&gt; et le &lt;a href="https://github.com/Azure-Samples/SQL-MCP-NoContainer"&gt;dépôt d&amp;rsquo;exemple sur GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Le SQL MCP Server sur App Service est une option pragmatique solide pour les équipes .NET qui souhaitent donner à leurs agents un accès structuré aux données SQL sans stratégie de conteneurs. Essaie-le — tes agents apprécieront la surface d&amp;rsquo;API propre.&lt;/p&gt;</content:encoded></item><item><title>SQL Server 2025 comme Base de Données Prête pour les Agents : Sécurité, Backup et MCP dans un Seul Moteur</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/</link><pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/</guid><description>La partie finale de la série Polyglot Tax aborde les problèmes de production difficiles : sécurité Row-Level unifiée sur les données relationnelles, JSON, graphes et vecteurs, plus intégration MCP.</description><content:encoded>&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai suivi la série Polyglot Tax d&amp;rsquo;Aditya Badramraju avec beaucoup d&amp;rsquo;intérêt. La partie 4 clôt la série avec les parties qui déterminent vraiment si vous feriez confiance à cette architecture en production.&lt;/p&gt;
&lt;h2 id="un-modèle-de-sécurité-pour-tous-les-modèles-de-données"&gt;Un Modèle de Sécurité pour Tous les Modèles de Données&lt;/h2&gt;
&lt;p&gt;Une seule politique Row-Level Security couvre toutes les tables — relationnelles, JSON, graphes, vecteurs. Une politique, une preuve pour l&amp;rsquo;auditeur.&lt;/p&gt;
&lt;h2 id="backup-unifié--récupération-atomique"&gt;Backup Unifié = Récupération Atomique&lt;/h2&gt;
&lt;p&gt;Dans un stack polyglottes, la récupération point-in-time sur cinq bases de données est un cauchemar de cohérence. Avec une seule base de données, c&amp;rsquo;est atomique par définition.&lt;/p&gt;
&lt;h2 id="intégration-mcp--agents-sans-middleware"&gt;Intégration MCP : Agents Sans Middleware&lt;/h2&gt;
&lt;p&gt;SQL Server 2025 supporte directement le SQL MCP Server. Les agents appellent des outils, le moteur impose l&amp;rsquo;isolation tenant et le masquage des colonnes automatiquement.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Pour les développeurs .NET qui construisent des applications agent-first sur Azure SQL, cette architecture mérite une sérieuse considération. Post original d&amp;rsquo;Aditya Badramraju : &lt;a href="https://devblogs.microsoft.com/azure-sql/the-polyglot-tax-part-4/"&gt;The Polyglot Tax – Part 4&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server — La bonne façon de donner accès aux bases de données aux agents IA</title><link>https://thedotnetblog.com/fr/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/fr/news/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</guid><description>SQL MCP Server de Data API builder donne aux agents IA un accès sécurisé et déterministe aux bases de données sans exposer les schémas ni dépendre de NL2SQL. RBAC, cache, support multi-bases — tout est intégré.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/news/emiliano-montesdeoca/sql-mcp-server-data-api-builder/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Soyons honnêtes : la plupart des serveurs MCP de bases de données disponibles aujourd&amp;rsquo;hui sont effrayants. Ils prennent une requête en langage naturel, génèrent du SQL à la volée et l&amp;rsquo;exécutent contre vos données de production. Qu&amp;rsquo;est-ce qui pourrait mal tourner ? (Tout. Absolument tout.)&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;équipe Azure SQL vient de &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;présenter SQL MCP Server&lt;/a&gt;, et il adopte une approche fondamentalement différente. Construit comme une fonctionnalité de Data API builder (DAB) 2.0, il donne aux agents IA un accès structuré et déterministe aux opérations de base de données — sans NL2SQL, sans exposer votre schéma, et avec un RBAC complet à chaque étape.&lt;/p&gt;
&lt;h2 id="pourquoi-pas-de-nl2sql-"&gt;Pourquoi pas de NL2SQL ?&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est la décision de conception la plus intéressante. Les modèles ne sont pas déterministes, et les requêtes complexes sont les plus susceptibles de produire des erreurs subtiles. Les requêtes exactes que les utilisateurs espèrent que l&amp;rsquo;IA peut générer sont aussi celles qui nécessitent le plus de vérification quand elles sont produites de manière non déterministe.&lt;/p&gt;
&lt;p&gt;À la place, SQL MCP Server utilise une approche &lt;strong&gt;NL2DAB&lt;/strong&gt;. L&amp;rsquo;agent travaille avec la couche d&amp;rsquo;abstraction d&amp;rsquo;entités de Data API builder et son constructeur de requêtes intégré pour produire du T-SQL précis et bien formé de manière déterministe. Même résultat pour l&amp;rsquo;utilisateur, mais sans le risque de JOINs hallucinés ou d&amp;rsquo;exposition accidentelle de données.&lt;/p&gt;
&lt;h2 id="sept-outils-pas-sept-cents"&gt;Sept outils, pas sept cents&lt;/h2&gt;
&lt;p&gt;SQL MCP Server expose exactement sept outils DML, quelle que soit la taille de la base de données :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;describe_entities&lt;/code&gt; — découvrir les entités et opérations disponibles&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create_record&lt;/code&gt; — insérer des lignes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read_records&lt;/code&gt; — interroger des tables et vues&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update_record&lt;/code&gt; — modifier des lignes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete_record&lt;/code&gt; — supprimer des lignes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;execute_entity&lt;/code&gt; — exécuter des procédures stockées&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aggregate_records&lt;/code&gt; — requêtes d&amp;rsquo;agrégation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C&amp;rsquo;est malin, car les fenêtres de contexte sont l&amp;rsquo;espace de réflexion de l&amp;rsquo;agent. Les inonder de centaines de définitions d&amp;rsquo;outils laisse moins de place au raisonnement. Sept outils fixes gardent l&amp;rsquo;agent concentré sur la &lt;em&gt;réflexion&lt;/em&gt; plutôt que la &lt;em&gt;navigation&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Chaque outil peut être activé ou désactivé individuellement :&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="démarrage-en-trois-commandes"&gt;Démarrage en trois commandes&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;Voilà un SQL MCP Server en fonctionnement qui expose votre table Customers. La couche d&amp;rsquo;abstraction d&amp;rsquo;entités vous permet de créer des alias pour les noms et colonnes, de limiter les champs par rôle et de contrôler exactement ce que les agents voient — sans exposer les détails internes du schéma.&lt;/p&gt;
&lt;h2 id="laspect-sécurité-est-solide"&gt;L&amp;rsquo;aspect sécurité est solide&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est là que la maturité de Data API builder porte ses fruits :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RBAC à chaque couche&lt;/strong&gt; — chaque entité définit quels rôles peuvent lire, créer, mettre à jour ou supprimer, et quels champs sont visibles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intégration Azure Key Vault&lt;/strong&gt; — chaînes de connexion et secrets gérés de manière sécurisée&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Entra + OAuth personnalisé&lt;/strong&gt; — authentification de niveau production&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content Security Policy&lt;/strong&gt; — les agents interagissent via un contrat contrôlé, pas du SQL brut&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;abstraction du schéma est particulièrement importante. Vos noms internes de tables et colonnes ne sont jamais exposés à l&amp;rsquo;agent. Vous définissez des entités, des alias et des descriptions qui ont du sens pour l&amp;rsquo;interaction IA — pas votre diagramme ERD de base de données.&lt;/p&gt;
&lt;h2 id="multi-bases-et-multi-protocoles"&gt;Multi-bases et multi-protocoles&lt;/h2&gt;
&lt;p&gt;SQL MCP Server supporte Microsoft SQL, PostgreSQL, Azure Cosmos DB et MySQL. Et comme c&amp;rsquo;est une fonctionnalité de DAB, vous obtenez des endpoints REST, GraphQL et MCP simultanément depuis la même configuration. Mêmes définitions d&amp;rsquo;entités, mêmes règles RBAC, même sécurité — sur les trois protocoles.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;auto-configuration dans DAB 2.0 peut même inspecter votre base de données et construire la configuration dynamiquement, si vous êtes à l&amp;rsquo;aise avec moins d&amp;rsquo;abstraction pour du prototypage rapide.&lt;/p&gt;
&lt;h2 id="mon-avis"&gt;Mon avis&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est ainsi que l&amp;rsquo;accès base de données d&amp;rsquo;entreprise pour les agents IA devrait fonctionner. Pas « hey LLM, écris-moi du SQL et YOLO sur la prod ». À la place : une couche d&amp;rsquo;entités bien définie, une génération de requêtes déterministe, RBAC à chaque étape, cache, monitoring et télémétrie. C&amp;rsquo;est ennuyeux de la meilleure façon possible.&lt;/p&gt;
&lt;p&gt;Pour les développeurs .NET, l&amp;rsquo;histoire d&amp;rsquo;intégration est propre — DAB est un outil .NET, le MCP Server tourne en conteneur, et il fonctionne avec Azure SQL, que la plupart d&amp;rsquo;entre nous utilisent déjà. Si vous construisez des agents IA qui ont besoin d&amp;rsquo;accéder aux données, commencez ici.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;SQL MCP Server est gratuit, open-source et tourne partout. C&amp;rsquo;est l&amp;rsquo;approche prescriptive de Microsoft pour donner aux agents IA un accès sécurisé aux bases de données. Consultez le &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;post complet&lt;/a&gt; et la &lt;a href="https://aka.ms/sql/mcp"&gt;documentation&lt;/a&gt; pour commencer.&lt;/p&gt;</content:encoded></item></channel></rss>