<?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/ru/tags/azure-sql/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>ru</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/ru/tags/azure-sql/index.xml" rel="self" type="application/rss+xml"/><item><title>NL2SQL — это SQL-инъекция агентной эпохи</title><link>https://thedotnetblog.com/ru/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/ru/news/emiliano-montesdeoca/nl2sql-agentic-sql-injection-mcp-server/</guid><description>Прежде чем позволить агенту запрашивать вашу базу данных на естественном языке, прочитайте это. NL2SQL выглядит простым, пока вы не задумаетесь о полноте схемы, недетерминизме и о том, что на самом деле решает SQL MCP Server.</description><content:encoded>&lt;p&gt;Есть версия предложения NL2SQL, которая звучит идеально: пользователи задают вопросы на естественном языке, агенты генерируют SQL, данные возвращаются. Меньше экранов, меньше запросов, меньше кода. Просто.&lt;/p&gt;
&lt;p&gt;Потом вы думаете об этом ещё пять минут.&lt;/p&gt;
&lt;h2 id="проблемы-о-которых-никто-не-говорит-на-демо"&gt;Проблемы, о которых никто не говорит на демо&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Схемы не были созданы для объяснения вещей.&lt;/strong&gt; Криптические имена таблиц, непоследовательные имена столбцов, технически допустимые связи, которые семантически недопустимы без дополнительных предикатов — это нормально для корпоративных баз данных. Это не баги, это просто накопленная история бизнес-изменений. Но когда вы просите модель вывести намерение из схемы, которая не была создана для передачи намерения, модель попробует в любом случае. Она не сдастся. Она сгенерирует свой лучший вариант запроса и вернёт результаты с уверенностью.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Модели недетерминированы.&lt;/strong&gt; Задайте один и тот же вопрос об одной базе данных дважды, и вы можете получить разный SQL. Модель вычисляет вероятности, и небольшие вариации в контексте дают разные результаты. Вы не можете тестированием добиться гарантии, что агент всегда генерирует правильный запрос.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Пользовательская проверка не масштабируется.&lt;/strong&gt; &amp;ldquo;Просто проверяйте каждый запрос перед выполнением&amp;rdquo; звучит безопасно. Но это предполагает, что пользователи являются экспертами как в модели данных, так и в SQL — именно те люди, которым не нужен был интерфейс на естественном языке. Это также вводит когнитивную перегрузку и новый класс предвзятости подтверждения, где пользователи, перегруженные сложностью запроса, утверждают недействительные запросы вместо того, чтобы их исследовать.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;И затем есть инъекция.&lt;/strong&gt; В традиционной разработке SQL параметризация решала проблему инъекции, потому что пользовательский ввод заполнял параметры, а не структуру SQL. С NL2SQL модель сама генерирует SQL. Подсказка, контекст схемы, история разговора и полученные данные — всё влияет на то, что выполняется. Если кто-то создаёт подсказку, которая изменяет то, что генерирует модель, это инъекция — не на уровне параметра, а на уровне генерации запроса. И в отличие от удаления таблицы (очевидно, восстановимо), инъекция NL2SQL производит запросы, возвращающие неверные результаты без видимой ошибки. Бизнес-решения принимаются на основе неверных данных.&lt;/p&gt;
&lt;h2 id="что-на-самом-деле-решает-sql-mcp-server"&gt;Что на самом деле решает SQL MCP Server&lt;/h2&gt;
&lt;p&gt;Именно здесь статья делает свой самый полезный практический вывод. Вместо того чтобы давать агенту произвольный доступ к схеме и надеяться на лучшее, SQL MCP Server предоставляет &lt;strong&gt;курируемую поверхность API&lt;/strong&gt;, построенную на основе &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;Разница важна: агент не генерирует SQL. Он вызывает именованные конечные точки, которые возвращают предопределённые формы результатов. SQL пишется один раз, разработчиком, и является детерминированным. Недетерминизм агента ограничен выбором &lt;em&gt;какую&lt;/em&gt; конечную точку вызвать, а не построением произвольных запросов.&lt;/p&gt;
&lt;p&gt;Это аналогично тому, что параметризация сделала с SQL-инъекцией в традиционной модели приложений — вы убираете возможность создавать произвольные запросы из ненадёжного ввода.&lt;/p&gt;
&lt;h2 id="правильный-вопрос"&gt;Правильный вопрос&lt;/h2&gt;
&lt;p&gt;Статья не говорит &amp;ldquo;никогда не используйте NL2SQL.&amp;rdquo; Она говорит: будьте целенаправленны в том, &lt;em&gt;где&lt;/em&gt; вы применяете его и &lt;em&gt;что&lt;/em&gt; вы открываете. Для исследовательского анализа в контролируемой среде, с ограниченной схемой и доступом только для чтения, NL2SQL может подойти. Для производственных систем, где бизнес-решения зависят от результатов, курируемый уровень API значительно безопаснее.&lt;/p&gt;
&lt;p&gt;Честность: некоторые проблемы действительно лучше решаются структурированными запросами за именованными конечными точками, чем естественным языком в SQL. SQL MCP Server даёт вам эту возможность, не отказываясь полностью от агентного интерфейса.&lt;/p&gt;
&lt;p&gt;Оригинальная публикация: &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 Теперь Может Генерировать Эмбеддинги — На Чистом T-SQL, Без Слоя Приложения</title><link>https://thedotnetblog.com/ru/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/ru/news/emiliano-montesdeoca/azure-sql-ai-generate-embeddings-ga-rag-tsql/</guid><description>AI_GENERATE_EMBEDDINGS и CREATE EXTERNAL MODEL теперь находятся в GA в Azure SQL Database и Managed Instance. RAG-пайплайны, построенные полностью на T-SQL, без необходимости перемещения данных.</description><content:encoded>&lt;p&gt;Если вы когда-нибудь создавали RAG-пайплайн, вы знаете налог пайплайна: ваши данные живут в SQL, но для генерации эмбеддингов нужно их извлечь, вызвать API эмбеддингов, обработать пакетную обработку и ограничения скорости, и сохранить результаты где-то с поддержкой векторного поиска. Часто в совершенно другой базе данных.&lt;/p&gt;
&lt;p&gt;Azure SQL только что устранил большую часть этого с двумя функциями, которые теперь стали общедоступными: &lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt; и &lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="что-они-делают"&gt;Что Они Делают&lt;/h2&gt;
&lt;p&gt;Эти две функции T-SQL работают как интегрированный пайплайн:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt;&lt;/strong&gt; — регистрирует внешний эндпоинт модели ИИ как именованный объект базы данных. Вы устанавливаете расположение, формат API, тип модели и учётные данные один раз. Повторно используете везде.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt;&lt;/strong&gt; — скалярная функция T-SQL, которая вызывает зарегистрированную модель и возвращает JSON-массив векторных значений. Работает в инструкциях SELECT, INSERT, UPDATE и MERGE.&lt;/p&gt;
&lt;p&gt;Вместе они формируют сквозной пайплайн эмбеддингов без выхода из SQL-движка.&lt;/p&gt;
&lt;h2 id="полный-рабочий-процесс"&gt;Полный Рабочий Процесс&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;-- Шаг 1: Зарегистрируйте провайдера эмбеддингов один раз
&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;-- Шаг 2: Генерируйте эмбеддинги встроенно в 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;-- Шаг 3: Поиск с векторным расстоянием
&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;Это весь пайплайн: данные в SQL, эмбеддинги генерируются в SQL, поиск по сходству в SQL. Без слоя оркестрации, без ETL, без отдельной векторной базы данных.&lt;/p&gt;
&lt;h2 id="поддерживаемые-форматы-api-и-параметры"&gt;Поддерживаемые Форматы API и Параметры&lt;/h2&gt;
&lt;p&gt;В GA &lt;code&gt;API_FORMAT&lt;/code&gt; поддерживает &lt;strong&gt;Azure OpenAI&lt;/strong&gt; и &lt;strong&gt;OpenAI&lt;/strong&gt;. &lt;code&gt;MODEL_TYPE&lt;/code&gt; пока ограничен значением &lt;code&gt;EMBEDDINGS&lt;/code&gt;. JSON &lt;code&gt;PARAMETERS&lt;/code&gt; позволяет устанавливать значения по умолчанию на уровне модели, включая количество повторных попыток:&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;Аутентификация использует учётные данные базы данных, поэтому секреты остаются вне кода приложения.&lt;/p&gt;
&lt;h2 id="что-это-открывает-для-приложений-net"&gt;Что Это Открывает для Приложений .NET&lt;/h2&gt;
&lt;p&gt;Для разработчиков .NET, создающих функции ИИ на основе существующих данных SQL, это значительно. Вам не нужно:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Извлекать данные в промежуточное хранилище для эмбеддингов&lt;/li&gt;
&lt;li&gt;Управлять внешним пайплайном эмбеддингов&lt;/li&gt;
&lt;li&gt;Настраивать отдельную векторную базу данных (хотя можно использовать Azure AI Search для полнофункционального векторного хранилища)&lt;/li&gt;
&lt;li&gt;Изменять слой доступа к данным приложения&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Вы можете постепенно добавлять семантический поиск в существующие SQL-приложения, используя те же инструменты T-SQL, которые у вас уже есть.&lt;/p&gt;
&lt;h2 id="заключение"&gt;Заключение&lt;/h2&gt;
&lt;p&gt;Паттерны RAG на SQL-данных стали значительно проще. &lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt; + &lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt; означает, что ваше существующее SQL-приложение может получить возможности векторного поиска без добавления новой инфраструктуры.&lt;/p&gt;
&lt;p&gt;Обе функции сегодня доступны в GA в Azure SQL Database и Azure SQL Managed Instance.&lt;/p&gt;
&lt;p&gt;Оригинальная публикация: &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 прекратил работу: перенесите рабочий процесс Azure SQL в VS Code</title><link>https://thedotnetblog.com/ru/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/ru/news/emiliano-montesdeoca/azure-data-studio-retired-move-to-vscode-sql/</guid><description>Azure Data Studio прекратил работу 6 февраля 2025 года, поддержка завершается 28 февраля 2026 года. Вот полный путь миграции в VS Code с расширением MSSQL.</description><content:encoded>&lt;p&gt;&lt;em&gt;Этот пост был переведён автоматически. Для оригинальной версии &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-data-studio-retired-move-to-vscode-sql/"&gt;нажмите здесь&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 прекратил работу 6 февраля 2025 года&lt;/a&gt;, поддержка завершается 28 февраля 2026 года — рекомендуемая замена: VS Code с расширением MSSQL.&lt;/p&gt;
&lt;h2 id="что-установить"&gt;Что установить&lt;/h2&gt;
&lt;p&gt;Три вещи для начала:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Расширение MSSQL&lt;/strong&gt; — найдите «SQL Server (mssql)» в Marketplace VS Code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Расширение SQL Database Projects&lt;/strong&gt; — схема как код, валидация сборки, управляемая публикация&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.NET 8 SDK&lt;/strong&gt; — требуется системой сборки; отсутствующий SDK — самая частая проблема при первом запуске&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="миграция-подключений-и-настроек-ads"&gt;Миграция подключений и настроек ADS&lt;/h2&gt;
&lt;p&gt;Расширение MSSQL включает &lt;strong&gt;ADS Migration Toolkit&lt;/strong&gt;, который выполняет одноразовую миграцию в управляемом потоке: сохранённые подключения, группы подключений, настройки и сочетания клавиш импортируются автоматически.&lt;/p&gt;
&lt;h2 id="восстановление-мышечной-памяти-f5"&gt;Восстановление мышечной памяти F5&lt;/h2&gt;
&lt;p&gt;Пользователи ADS привыкли запускать запросы клавишей F5. Установите расширение &lt;strong&gt;MSSQL Database Management Keymap&lt;/strong&gt;, чтобы вернуть сочетания клавиш в стиле ADS, включая F5.&lt;/p&gt;
&lt;h2 id="sql-database-projects-схема-как-код"&gt;SQL Database Projects: схема как код&lt;/h2&gt;
&lt;p&gt;Правая кнопка мыши на проекте → &lt;strong&gt;Опубликовать&lt;/strong&gt; → настроить цель → просмотреть сгенерированный T-SQL-скрипт → развернуть. Предварительный просмотр скрипта перед развёртыванием — ключевая функция безопасности. Шаблоны элементов генерируют заготовки для таблиц, хранимых процедур и представлений — тот же рабочий процесс, что и в SSDT.&lt;/p&gt;
&lt;p&gt;Частая проблема: &lt;strong&gt;несоответствие целевой платформы&lt;/strong&gt; в файле &lt;code&gt;.sqlproj&lt;/code&gt; вызовет ошибки сборки, если проект был создан для другой версии SQL Server.&lt;/p&gt;
&lt;h2 id="schema-compare-и-schema-designer"&gt;Schema Compare и Schema Designer&lt;/h2&gt;
&lt;p&gt;Расширение также включает &lt;strong&gt;Schema Compare&lt;/strong&gt; (сравнение проекта с развёрнутой базой данных) и &lt;strong&gt;Schema Designer&lt;/strong&gt; (визуальное редактирование схемы без написания DDL вручную).&lt;/p&gt;
&lt;h2 id="разработчики-microsoft-fabric"&gt;Разработчики Microsoft Fabric&lt;/h2&gt;
&lt;p&gt;Настройка идентична, но начните с &lt;strong&gt;портала Fabric&lt;/strong&gt; и сначала подключите базу данных к Git, прежде чем открывать её в VS Code. У Microsoft есть специальное руководство: &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="итог"&gt;Итог&lt;/h2&gt;
&lt;p&gt;Миграция — это одноразовый управляемый процесс, а не ручная пересборка. Установите три инструмента, запустите ADS Migration Toolkit, восстановите сочетания клавиш — и вернётесь к обычной работе менее чем за 10 минут.&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;полную статью&lt;/a&gt; с пошаговыми скриншотами и инструкцией для Fabric.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server на Azure App Service — без контейнеров</title><link>https://thedotnetblog.com/ru/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/ru/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/</guid><description>SQL MCP Server теперь может работать на Azure App Service без Docker и Kubernetes. Что это значит для .NET-разработчиков, создающих AI-агентов для работы с SQL-базами данных.</description><content:encoded>&lt;p&gt;&lt;em&gt;Этот пост переведён автоматически. Чтобы прочитать оригинал, &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/"&gt;нажмите здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Честно говоря: каждый раз, когда в туториале вижу «требует контейнер», где-то внутри вздыхаю. Контейнеры великолепны — пока у вашей команды нет стратегии контейнеризации, и функция, казавшаяся простой, вдруг упирается в неожиданную оркестрационную сложность, которую никто не планировал.&lt;/p&gt;
&lt;p&gt;Именно поэтому это привлекло моё внимание. SQL MCP Server теперь может работать на Azure App Service — без Docker, без Kubernetes, только с тем же конфигурационным файлом Data API Builder (DAB), который открывает ваш SQL-датабаз через MCP, REST и GraphQL.&lt;/p&gt;
&lt;h2 id="что-такое-sql-mcp-server"&gt;Что такое SQL MCP Server?&lt;/h2&gt;
&lt;p&gt;Кратко для тех, кто ещё не знаком. SQL MCP Server располагается между вашим AI-агентом и SQL-базой данных. Вместо того чтобы давать агенту прямой доступ к базе данных (ужасная идея), он открывает ваши таблицы и представления как уровень абстракции — сущности с определёнными правами доступа.&lt;/p&gt;
&lt;p&gt;Построен на &lt;a href="https://learn.microsoft.com/ru-ru/azure/data-api-builder/"&gt;Data API Builder&lt;/a&gt;, что означает: один конфигурационный файл управляет MCP &lt;em&gt;и&lt;/em&gt; REST &lt;em&gt;и&lt;/em&gt; GraphQL одновременно. Ваш агент общается с MCP-эндпоинтом. Традиционное приложение общается с REST или GraphQL. Одна конфигурация, одна среда выполнения, разные интерфейсы.&lt;/p&gt;
&lt;p&gt;Это действительно удобно. Не нужно поддерживать два отдельных API-слоя.&lt;/p&gt;
&lt;h2 id="проблема-контейнеров-и-её-решение"&gt;Проблема контейнеров (и её решение)&lt;/h2&gt;
&lt;p&gt;Изначальная модель развёртывания SQL MCP Server использовала контейнеры. Это хорошо работает во многих командах — но не во всех. Многие .NET-команды стандартизировались на Azure App Service или виртуальных машинах. Требовать контейнерный runtime только ради одного SQL-эндпоинта — это лишнее трение, которого никто не просил.&lt;/p&gt;
&lt;p&gt;Новое руководство показывает, как обойтись без контейнера вовсе. Всё работает через команду &lt;code&gt;dab start&lt;/code&gt;, запущенный как стандартный .NET 8 веб-процесс на App Service.&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;# Установка 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;# Инициализация конфигурации&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;# Добавление сущности&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;# Настройка провайдера аутентификации 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;# Запуск сервера&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;На этом этапе у вас есть MCP по адресу &lt;code&gt;/mcp&lt;/code&gt;, REST и GraphQL из того же процесса — и ничего в контейнере.&lt;/p&gt;
&lt;h2 id="аутентификация-без-общих-api-ключей"&gt;Аутентификация без общих API-ключей&lt;/h2&gt;
&lt;p&gt;Это та часть, которую я ценю больше всего. При развёртывании на App Service вы настраиваете Microsoft Entra ID в качестве провайдера аутентификации. Никаких общих секретов в конфигурационных файлах, никаких API-ключей для ротации.&lt;/p&gt;
&lt;p&gt;Строка подключения хранится в переменных среды App Service (не в &lt;code&gt;dab-config.json&lt;/code&gt;), а MCP-эндпоинт защищён платформенной аутентификацией. Если ваши Azure-нагрузки уже используют Entra ID, интеграция происходит органично.&lt;/p&gt;
&lt;p&gt;Для локальной разработки переключайтесь в режим &lt;code&gt;Simulator&lt;/code&gt; и STDIO-транспорт. Возвращайтесь к режиму &lt;code&gt;AppService&lt;/code&gt; перед развёртыванием. Чисто и явно.&lt;/p&gt;
&lt;h2 id="развёртывание-на-app-service"&gt;Развёртывание на 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;Затем разверните свой DAB-проект методом, который уже использует ваша команда. Ключевой момент: это развёртывание &lt;strong&gt;кода&lt;/strong&gt;, а не контейнера.&lt;/p&gt;
&lt;h2 id="почему-это-важно-для-net-разработчиков"&gt;Почему это важно для .NET-разработчиков&lt;/h2&gt;
&lt;p&gt;Если вы создаёте AI-агентов на .NET, рано или поздно им нужно будет работать с базой данных. SQL MCP Server предоставляет структурированный способ сделать это — без открытия сырых строк подключения или написания собственных API-слоёв.&lt;/p&gt;
&lt;p&gt;Ознакомьтесь с полным руководством в &lt;a href="https://devblogs.microsoft.com/azure-sql/sql-mcp-server-app-service/"&gt;оригинальной статье&lt;/a&gt; и &lt;a href="https://github.com/Azure-Samples/SQL-MCP-NoContainer"&gt;примере на GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="итог"&gt;Итог&lt;/h2&gt;
&lt;p&gt;SQL MCP Server на App Service — практичный выбор для .NET-команд, которые хотят дать агентам структурированный доступ к SQL-данным без контейнерной стратегии. Попробуйте — ваши агенты оценят чистый API-интерфейс.&lt;/p&gt;</content:encoded></item><item><title>SQL Server 2025 как База Данных для Агентов: Безопасность, Бэкап и MCP в Одном Движке</title><link>https://thedotnetblog.com/ru/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/ru/news/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/</guid><description>Финальная часть серии Polyglot Tax разбирает сложные задачи производства: единая Row-Level Security по реляционным, JSON, граф и векторным данным, плюс MCP-интеграция.</description><content:encoded>&lt;p&gt;&lt;em&gt;Этот пост был автоматически переведён. Для оригинальной версии &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/"&gt;нажмите здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Я следил за серией Polyglot Tax Адитьи Бадрамраджу с большим интересом. Часть 4 завершает серию частями, которые реально определяют, доверяли бы вы этой архитектуре в продакшне.&lt;/p&gt;
&lt;h2 id="одна-модель-безопасности-для-всех-моделей-данных"&gt;Одна Модель Безопасности для Всех Моделей Данных&lt;/h2&gt;
&lt;p&gt;Одна политика Row-Level Security покрывает все таблицы — реляционные, JSON, граф, векторы. Одна политика, одно доказательство для аудитора.&lt;/p&gt;
&lt;h2 id="единый-бэкап--атомарное-восстановление"&gt;Единый Бэкап = Атомарное Восстановление&lt;/h2&gt;
&lt;p&gt;В полиглотном стеке point-in-time recovery через пять баз данных — это кошмар согласованности. С одной базой данных восстановление атомарно по определению.&lt;/p&gt;
&lt;h2 id="mcp-интеграция-агенты-без-middleware"&gt;MCP-Интеграция: Агенты Без Middleware&lt;/h2&gt;
&lt;p&gt;SQL Server 2025 напрямую поддерживает SQL MCP Server. Агенты вызывают инструменты, движок автоматически обеспечивает изоляцию тенантов и маскировку столбцов.&lt;/p&gt;
&lt;p&gt;Оригинальный пост Адитьи Бадрамраджу: &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 — Правильный способ дать AI-агентам доступ к базе данных</title><link>https://thedotnetblog.com/ru/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/ru/news/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</guid><description>SQL MCP Server от Data API builder даёт AI-агентам безопасный, детерминированный доступ к базам данных без раскрытия схем и без NL2SQL. RBAC, кеширование, поддержка нескольких баз — всё встроено.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Этот пост был переведён автоматически. Оригинал можно прочитать &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/sql-mcp-server-data-api-builder/"&gt;здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Давайте будем честны: большинство доступных сегодня MCP-серверов для баз данных устрашают. Они берут запрос на естественном языке, генерируют SQL на лету и выполняют его против ваших продакшн-данных. Что может пойти не так? (Всё. Абсолютно всё.)&lt;/p&gt;
&lt;p&gt;Команда Azure SQL только что &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;представила SQL MCP Server&lt;/a&gt;, и он использует принципиально другой подход. Построенный как функция Data API builder (DAB) 2.0, он даёт AI-агентам структурированный, детерминированный доступ к операциям с базой данных — без NL2SQL, без раскрытия вашей схемы и с полным RBAC на каждом шагу.&lt;/p&gt;
&lt;h2 id="почему-не-nl2sql"&gt;Почему не NL2SQL?&lt;/h2&gt;
&lt;p&gt;Это самое интересное проектное решение. Модели недетерминированы, а сложные запросы наиболее склонны порождать тонкие ошибки. Именно те запросы, которые пользователи надеются, что AI сможет сгенерировать, также требуют наибольшей проверки, когда генерируются недетерминированно.&lt;/p&gt;
&lt;p&gt;Вместо этого SQL MCP Server использует подход &lt;strong&gt;NL2DAB&lt;/strong&gt;. Агент работает со слоем абстракции сущностей Data API builder и встроенным конструктором запросов для детерминированной генерации точного, хорошо сформированного T-SQL. Тот же результат для пользователя, но без риска галлюцинированных JOIN или случайного раскрытия данных.&lt;/p&gt;
&lt;h2 id="семь-инструментов-а-не-семьсот"&gt;Семь инструментов, а не семьсот&lt;/h2&gt;
&lt;p&gt;SQL MCP Server предоставляет ровно семь DML-инструментов, независимо от размера базы данных:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;describe_entities&lt;/code&gt; — обнаружение доступных сущностей и операций&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create_record&lt;/code&gt; — вставка строк&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read_records&lt;/code&gt; — запрос таблиц и представлений&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update_record&lt;/code&gt; — изменение строк&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete_record&lt;/code&gt; — удаление строк&lt;/li&gt;
&lt;li&gt;&lt;code&gt;execute_entity&lt;/code&gt; — выполнение хранимых процедур&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aggregate_records&lt;/code&gt; — запросы агрегации&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Это умно, потому что контекстные окна — это пространство для мышления агента. Наводнение их сотнями определений инструментов оставляет меньше места для рассуждений. Семь фиксированных инструментов держат агента сфокусированным на &lt;em&gt;мышлении&lt;/em&gt;, а не на &lt;em&gt;навигации&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Каждый инструмент можно включить или выключить отдельно:&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="начало-за-три-команды"&gt;Начало за три команды&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;Это работающий SQL MCP Server, предоставляющий доступ к вашей таблице Customers. Слой абстракции сущностей позволяет задавать псевдонимы для имён и столбцов, ограничивать поля по ролям и точно контролировать, что видят агенты — не раскрывая внутренних деталей схемы.&lt;/p&gt;
&lt;h2 id="история-безопасности-убедительна"&gt;История безопасности убедительна&lt;/h2&gt;
&lt;p&gt;Здесь зрелость Data API builder окупается:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RBAC на каждом уровне&lt;/strong&gt; — каждая сущность определяет, какие роли могут читать, создавать, обновлять или удалять, и какие поля видны&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Интеграция с Azure Key Vault&lt;/strong&gt; — строки подключения и секреты управляются безопасно&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Entra + пользовательский OAuth&lt;/strong&gt; — аутентификация продакшн-уровня&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content Security Policy&lt;/strong&gt; — агенты взаимодействуют через контролируемый контракт, а не сырой SQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Абстракция схемы особенно важна. Внутренние имена таблиц и столбцов никогда не раскрываются агенту. Вы определяете сущности, псевдонимы и описания, имеющие смысл для AI-взаимодействия — а не вашу ER-диаграмму.&lt;/p&gt;
&lt;h2 id="мульти-база-и-мульти-протокол"&gt;Мульти-база и мульти-протокол&lt;/h2&gt;
&lt;p&gt;SQL MCP Server поддерживает Microsoft SQL, PostgreSQL, Azure Cosmos DB и MySQL. А поскольку это функция DAB, вы получаете REST, GraphQL и MCP эндпоинты одновременно из одной конфигурации. Те же определения сущностей, те же правила RBAC, та же безопасность — по всем трём протоколам.&lt;/p&gt;
&lt;p&gt;Автоконфигурация в DAB 2.0 может даже проинспектировать вашу базу данных и динамически построить конфигурацию, если вам подходит меньше абстракции для быстрого прототипирования.&lt;/p&gt;
&lt;h2 id="моё-мнение"&gt;Моё мнение&lt;/h2&gt;
&lt;p&gt;Вот как должен работать корпоративный доступ к базам данных для AI-агентов. Не «эй, LLM, напиши мне SQL и YOLO его по продакшну». Вместо этого: чётко определённый слой сущностей, детерминированная генерация запросов, RBAC на каждом шагу, кеширование, мониторинг и телеметрия. Скучно в самом лучшем смысле.&lt;/p&gt;
&lt;p&gt;Для .NET-разработчиков история интеграции чистая — DAB является .NET-инструментом, MCP Server работает как контейнер и интегрируется с Azure SQL, который большинство из нас уже использует. Если вы строите AI-агентов, которым нужен доступ к данным, начните здесь.&lt;/p&gt;
&lt;h2 id="подводя-итоги"&gt;Подводя итоги&lt;/h2&gt;
&lt;p&gt;SQL MCP Server бесплатен, с открытым исходным кодом и работает где угодно. Это предписывающий подход Microsoft к предоставлению AI-агентам безопасного доступа к базам данных. Ознакомьтесь с &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;полным постом&lt;/a&gt; и &lt;a href="https://aka.ms/sql/mcp"&gt;документацией&lt;/a&gt; для начала работы.&lt;/p&gt;</content:encoded></item></channel></rss>