<?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>SQL MCP Server | The .NET Blog</title><link>https://thedotnetblog.com/zh/tags/sql-mcp-server/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>zh</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/zh/tags/sql-mcp-server/index.xml" rel="self" type="application/rss+xml"/><item><title>NL2SQL 是智能体时代的 SQL 注入</title><link>https://thedotnetblog.com/zh/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/zh/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;模式（Schema）不是为了解释事物而设计的。&lt;/strong&gt; 晦涩的表名、不一致的列名、在没有额外谓词的情况下语义上无效的技术有效关系——这在企业数据库中很常见。这些不是 bug，只是业务变更积累的历史。但当你要求模型从一个并非为传达意图而设计的模式中推断意图时，模型还是会尝试。它不会放弃。它会生成最佳查询并自信地返回结果。&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;quot;听起来很安全。但这假设用户既是数据模型又是 SQL 的专家——恰恰是那些不需要自然语言界面的人。它还引入了认知过载和新型确认偏差，被查询复杂性压倒的用户会批准无效查询而不是去调查它们。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;然后还有注入。&lt;/strong&gt; 在传统 SQL 开发中，参数化解决了注入问题，因为用户输入填充的是参数，而不是 SQL 结构。在 NL2SQL 中，模型本身生成 SQL。提示词、模式上下文、对话历史和检索的数据都会影响执行的内容。如果有人精心设计一个改变模型生成内容的提示，那就是注入——不是在参数级别，而是在查询生成级别。与 DROP TABLE（明显、可恢复）不同，NL2SQL 注入会产生在没有可见错误的情况下返回错误结果的查询。业务决策基于错误数据做出。&lt;/p&gt;
&lt;h2 id="sql-mcp-server-究竟解决了什么"&gt;SQL MCP Server 究竟解决了什么&lt;/h2&gt;
&lt;p&gt;这里文章提出了最有用的实用观点。SQL MPC Server 不是给智能体任意的模式访问权限并期待最好的结果，而是暴露了一个建立在 &lt;a href="https://learn.microsoft.com/en-us/azure/data-api-builder/overview"&gt;Data API builder&lt;/a&gt; 之上的&lt;strong&gt;精心策划的 API 表面&lt;/strong&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;quot;永远不要使用 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></channel></rss>