· · 1 分钟阅读

NL2SQL 是智能体时代的 SQL 注入

在让智能体用自然语言查询你的数据库之前,请先读这篇文章。NL2SQL 看起来简单,直到你思考模式完整性、非确定性,以及 SQL MCP Server 究竟解决了什么。

Azure SQL AI Agents MCP SQL MCP Server Security
这篇文章也有其他语言版本:English, Español, Català, Deutsch, Français, Português, Italiano, 日本語, 한국어, Русский, हिन्दी, Polski, Türkçe, العربية, Bahasa Indonesia, Nederlands

NL2SQL 有一个听起来很完美的推介版本:用户用自然语言提问,智能体生成 SQL,数据返回。更少的界面,更少的查询,更少的代码。简单。

然后你再多想五分钟。

演示中没人提的问题

模式(Schema)不是为了解释事物而设计的。 晦涩的表名、不一致的列名、在没有额外谓词的情况下语义上无效的技术有效关系——这在企业数据库中很常见。这些不是 bug,只是业务变更积累的历史。但当你要求模型从一个并非为传达意图而设计的模式中推断意图时,模型还是会尝试。它不会放弃。它会生成最佳查询并自信地返回结果。

模型是非确定性的。 对同一个数据库问同一个问题两次,你可能会得到不同的 SQL。模型在计算概率,上下文中的细微变化会产生不同的输出。你无法通过测试获得智能体总是生成正确查询的保证。

用户审查无法扩展。 “执行前只需审查每个查询"听起来很安全。但这假设用户既是数据模型又是 SQL 的专家——恰恰是那些不需要自然语言界面的人。它还引入了认知过载和新型确认偏差,被查询复杂性压倒的用户会批准无效查询而不是去调查它们。

然后还有注入。 在传统 SQL 开发中,参数化解决了注入问题,因为用户输入填充的是参数,而不是 SQL 结构。在 NL2SQL 中,模型本身生成 SQL。提示词、模式上下文、对话历史和检索的数据都会影响执行的内容。如果有人精心设计一个改变模型生成内容的提示,那就是注入——不是在参数级别,而是在查询生成级别。与 DROP TABLE(明显、可恢复)不同,NL2SQL 注入会产生在没有可见错误的情况下返回错误结果的查询。业务决策基于错误数据做出。

SQL MCP Server 究竟解决了什么

这里文章提出了最有用的实用观点。SQL MPC Server 不是给智能体任意的模式访问权限并期待最好的结果,而是暴露了一个建立在 Data API builder 之上的精心策划的 API 表面

差异很重要:智能体不生成 SQL。它调用返回预定义结果形状的命名端点。SQL 由开发人员编写一次,是确定性的。智能体的非确定性被限制在选择调用哪个端点,而不是组合任意查询。

这类似于参数化在传统应用模型中对 SQL 注入所做的——消除了从不受信任的输入构建任意查询的能力。

正确的问题

这篇文章不是说"永远不要使用 NL2SQL”。它说:对在哪里应用它以及暴露什么要有意识。对于在受控环境中、具有有限范围模式和只读访问权限的探索性分析,NL2SQL 可能没问题。对于业务决策依赖于结果的生产系统,经过精心策划的 API 层要安全得多。

说实话:有些问题确实更适合用命名端点后面的结构化查询来解决,而不是自然语言到 SQL。SQL MCP Server 为你提供了这个选项,而不必完全放弃智能体界面。

原文链接:Considering NL2SQL? Should your database really be the prompt? How can SQL MCP Server help?

分享:
在GitHub上查看此文章的源代码 ↗
← Microsoft Foundry 2026年4月:Foundry Local GA、GPT-5.5、Hyperlight上的CodeAct