SQL MCP Server 如何让每次数据库写操作都经过人工批准?

作者:袖梨 2026-09-13

Data Peek 0.26 把桌面 SQL 客户端中的真实数据库连接暴露为本地 MCP Server,并把读取与写入分成两条路径。list_connections、list_schemas、run_query 和 explain_query 等读取工具可以直接运行,但受到回滚事务和 500 行限制;写入统一走 execute_statement,在桌面应用中显示完整 SQL,只有用户点击 Approve 才执行,60 秒未确认会自动拒绝。

这种设计把人工审批放在模型无法自行操作的图形界面中,比让 Agent 调用另一个 approve 工具更可靠。它仍不是绝对安全:用户可能误批,数据库账号可能权限过大,显示的 SQL 也可能难以判断真实影响。生产使用需要数据库最小权限、清晰连接标识、影响预览和独立审计共同配合。

为什么桌面 SQL 客户端适合承载审批

Data Peek 本来就管理 PostgreSQL、MySQL、SQL Server 与 SQLite 连接,用户能在同一界面查看数据库目标和查询。

MCP 请求到达后,应用可以在本地弹出原生确认框,不需要把数据库密码交给 Agent,也不需要另建远程审批服务。

审批者看到的是工具将实际执行的 SQL,而不是模型对操作的自然语言概括,减少描述与行为不一致。

MCP Server 默认关闭

Data Peek 的 MCP 功能默认不启用,用户必须在设置中主动打开。这符合能力最小化原则。

不使用 Agent 访问时保持关闭,避免长期运行不必要的本地端口。应用重装或新设备也不应自动继承开启状态。

启用时记录版本、地址、token 和可见连接,作为当前授权基线。

仅 localhost

服务默认 127.0.0.1:4722,只接受本机连接。它不会直接向局域网或公网暴露数据库工具。

localhost 仍不是身份认证。恶意本机进程、浏览器扩展或被攻破的开发工具可能尝试访问端口。

不要通过端口转发、反向代理或修改绑定地址把本地服务变成远程共享服务,除非重新设计 TLS、用户认证和授权。

bearer token 的作用

本地 MCP 连接需要 bearer token,防止任何能访问端口的进程直接调用。token 应由应用生成并通过受控配置交给客户端。

不要把 token 放进提示、公开仓库、终端截图或诊断日志。客户端配置文件只允许当前系统用户读取。

token 泄露后可轮换,旧值立即失效。长期固定 token 应定期更新,并记录最后使用时间。

数据库凭据不会暴露给 Agent

Agent 使用 Data Peek 已保存的连接,不接收原始连接串和密码。连接凭据由操作系统钥匙串本地加密保存。

工具调用应使用稳定连接标识。模型不应提交任意主机、端口或账号,把桌面应用变成通用数据库代理。

钥匙串保护降低明文泄露,但被解锁的用户会话仍可能使用连接。系统账号、屏幕锁和本机恶意软件防护不可忽略。

读取工具如何运行

run_query 面向读取,结果最多 500 行,并在事务结束时回滚。PostgreSQL 还额外使用数据库级 READ ONLY。

回滚可以清理事务内状态,但不能收回已返回给模型的数据。账号只能读取批准库表与字段。

MySQL、SQL Server 和 SQLite 的只读保证机制不同,应分别测试,不根据 PostgreSQL 行为推断其他驱动。

为什么读取可以自由运行

模式探索与小范围 SELECT 是开发助手最常见工作。每次都弹窗会产生确认疲劳,用户最终可能机械批准。

Data Peek 用回滚、行数上限和数据库权限降低读取成本,保留流畅体验。

敏感读取仍可能需要审批。生产环境可用只读副本、脱敏视图或独立连接,让“自由读取”只发生在批准数据域。

500 行上限保护什么

上限避免一次查询把整张表塞进 MCP 响应和模型上下文,也降低桌面应用内存压力。

它不限制扫描成本。排序、聚合和复杂 JOIN 可能只返回 500 行,却读取大量数据。

响应应标明截断,模型不能把部分结果误认为全集。还需要数据库超时与取消能力。

execute_statement 是写入闸门

所有写入通过独立工具 execute_statement,而不是与 run_query 混在同一入口。工具名称清楚表达副作用。

服务收到请求后不立即执行,先创建待审批项并通知桌面界面。只有批准状态才继续数据库调用。

拒绝、超时和窗口关闭都应返回明确错误,不能因为 UI 异常默认通过。

确认框应该显示什么

原帖说明确认框展示完整 SQL。可靠实现还应显示连接名称、数据库、环境、语句类型和请求来源。

对于 UPDATE、DELETE 和 INSERT,显示是否有 WHERE、目标表、参数值的脱敏表示和预计影响行数。

DDL、权限与危险管理命令应使用更强警示,生产默认拒绝,而不是仅与普通单行更新使用同样按钮。

60 秒自动拒绝

待审批请求在 60 秒后自动 reject,防止旧弹窗长时间保留,用户稍后误批已经失去上下文的操作。

超时不是执行失败重试信号。Agent 不应自动反复提交相同写入,制造弹窗轰炸。

审批期间 SQL、参数或目标连接变化时,旧请求立即作废,并产生新确认。

批准必须绑定不可变请求

确认记录绑定原始 SQL 字节、参数、连接 ID、数据库账号、客户端、策略版本和唯一 nonce。

用哈希确保审批后不能替换 WHERE 或连接。摘要不一致时拒绝执行。

批准只可消费一次,并在 60 秒后过期,阻止重复执行和重放。

为什么 Agent 不能自己批准

如果 MCP 同时暴露 approve_write 工具,模型可以在一次计划中提交和批准,人工边界形同虚设。

Data Peek 将批准放在桌面应用按钮中,要求用户直接交互。MCP 客户端只能等待结果。

还要确保自动化、键盘快捷键和辅助功能接口不会被同一 Agent 轻易操控,否则边界会被旁路。

审批疲劳

大量细碎写入会让用户快速点击 Approve。系统应合并同一事务的变更,给出整体影响,而不是连续弹几十个窗口。

高风险连接使用更明显颜色与名称,生产审批要求重新确认或输入短语。低风险开发库可以使用不同策略。

统计批准率与响应时间。接近百分之百的秒批可能表示流程只剩形式。

影响行数预览

DELETE 和 UPDATE 在执行前使用同一 WHERE 生成 COUNT 或主键样本,帮助用户理解范围。

预览和执行之间数据可能变化。最终语句在事务中重新检查实际影响行数,超过批准阈值自动回滚。

无 WHERE、全表影响或跨租户修改在策略层直接拒绝,不依赖人工识别。

数据库最小权限仍必需

审批逻辑是应用层代码,可能存在漏洞。连接账号只拥有业务必要权限,提供最后防线。

读取连接与写入连接分离更稳妥。大多数 Agent 会话只看到只读连接,临时写连接需要额外开启。

生产禁用 DROP、ALTER、GRANT 和高权限过程,即使用户误批,数据库也拒绝。

多数据库连接的误选风险

Data Peek 支持 PostgreSQL、MySQL、SQL Server 和 SQLite。模型可能在名称相近的连接间选错。

连接名称明确包含环境与业务,例如 orders-prod-ro。确认框同时显示主机别名和数据库。

生产连接默认只读,并允许用户在 MCP 设置中完全隐藏不需要的连接。

查询计划工具

explain_query 帮助 Agent 在执行前检查索引、JOIN 和成本。普通 EXPLAIN 不应执行目标写入。

某些数据库的 ANALYZE 选项会真实运行 SQL,应明确拒绝或走写入审批。

计划输出可能包含对象和参数信息,也受 500 行或响应大小限制。

哈希链审计日志

Data Peek 提供本地审计日志,每条记录与前一条哈希关联。修改或删除中间事件会破坏后续链验证。

日志记录执行语句,并可导出 CSV 或 JSON。完整 SQL 可能包含数据值,因此审计文件本身属于敏感数据。

哈希链能发现篡改,不会阻止拥有文件权限的人删除整个日志。重要环境把导出发送到独立不可变存储。

审计默认关闭

仓库说明审计功能默认关闭。生产启用 MCP 时应同时显式打开审计并验证完整性。

不能因本地存储而假设自动记录。启动检查需要读取有效设置,并执行一条测试查询确认事件出现。

日志失败时,高风险写入可选择失败关闭,避免出现无记录执行。

审计事件需要哪些字段

记录时间、客户端、工具、连接、用户、SQL 哈希、风险类型、审批决定、审批耗时、数据库结果和影响行数。

写入记录包含批准者和一次性请求 ID。读取记录也需要保留,因为数据泄露通常来自 SELECT。

密码、bearer token 和系统钥匙串内容永远不写入日志,参数按数据分类脱敏。

如何验证哈希链

定期运行应用提供的 integrity verification,而不是只在事故后检查。结果和最后链头哈希保存到独立位置。

导出 CSV 适合分析,JSON 更适合保留结构和验证字段。导出文件设置严格权限与保留期。

发现链断裂时停止高风险写入,保存原文件并调查应用更新、磁盘故障或人为修改。

Watch Mode 的额外保护

Data Peek 的 Watch Mode 会周期性重跑 SELECT,并在执行前拒绝 INSERT、UPDATE、DELETE、DDL、事务和多语句。

窗口隐藏时暂停,避免后台标签持续压数据库。轮询间隔最短可很短,生产仍需限制并发与查询成本。

Watch 与 MCP 是不同入口,但应使用相同只读策略,避免用户通过另一个功能绕过预期。

本地快照与隐私

Time Machine 会保存成功 SELECT 结果用于历史比较,掩码列保持脱敏,并有运行次数与全局容量上限。

即使 MCP 查询只读,本地快照也是数据副本。生产敏感连接应关闭不需要的历史保存,或使用全局擦除。

审计日志与结果快照用途不同:前者证明动作,后者保存数据。权限和保留策略应分开。

安装与更新风险

项目提供多个平台安装包,也可从 MIT 源码构建。生产固定签名版本并核验发布来源。

自动更新可能改变 MCP 工具与审批逻辑。先在测试连接验证,再推广到管理生产连接的客户端。

商业预构建许可与源码许可有所差异,组织部署前核对许可要求,不影响安全判断但影响运维路径。

负向测试

尝试 INSERT、UPDATE、DELETE、DROP、ALTER、GRANT、多语句和危险过程,确认都进入审批或被直接拒绝。

提交后修改 SQL、重放批准 ID、超过 60 秒再确认、并发点击与重启应用,确认不会错误执行。

关闭窗口、断开数据库和审计写入失败时,默认结果应是拒绝或回滚。

读取测试

运行合法 SELECT、CTE、JOIN 和 explain,确认事务回滚、最多 500 行并带截断信息。

尝试副作用函数、SELECT INTO 和多语句,验证不同数据库驱动的真实边界。

用只读账号直接测试写入,证明即使审批层失效,数据库仍拒绝。

PostgreSQL 执行边界

PostgreSQL 读取除通用回滚外还进入 READ ONLY 事务,由数据库引擎拒绝常规 DML 与 DDL。专用账号仍只授予目标 schema 和对象 SELECT。

检查 SECURITY DEFINER 函数、PUBLIC EXECUTE、search_path 与行级安全。SELECT 函数可能带副作用,不能只根据首个关键词判断。

获批写入应在独立事务执行,设置 statement_timeout 与最大影响行数,成功后明确提交,失败则回滚并写审计。

MySQL 执行边界

MySQL 的会话只读、事务引擎与函数行为和 PostgreSQL 不同。非事务表的修改可能无法依赖 ROLLBACK 撤销。

账号撤销 FILE、PROCESS、管理、DDL 和不需要的写权限。版本条件注释、存储函数、INTO OUTFILE 等需要负向测试。

连接池复用时恢复 autocommit、当前 database 和会话变量,避免前一请求状态影响下一次 Agent 调用。

SQL Server 执行边界

SQL Server 连接使用专用登录和数据库用户,只加入批准读取角色。避免 sysadmin、db_owner 和跨数据库所有权链。

检查 EXECUTE 权限、链接服务器、外部数据源和 SELECT INTO。看似查询的语句也可能创建表或访问其他实例。

写入审批显示三段或四段对象名与实际数据库,防止默认 database 和显式限定名称不一致。

SQLite 执行边界

SQLite 没有服务器账号角色。读取连接应以只读方式打开文件,生产优先使用快照副本,并限制数据库目录权限。

关闭扩展加载与任意 ATTACH,避免 SQL 能力扩展到本机文件和代码。写入批准无法弥补桌面进程对其他文件拥有过大权限。

审批执行后确认 journal、WAL 与事务状态清理,应用崩溃恢复不会重复提交旧请求。

审批时的连接竞态

弹窗出现后,用户可能在 Data Peek 中重命名、断开或切换连接。待审批请求必须绑定内部不可变 connection id,不依赖当前选中的标签页。

数据库重连后会话身份或默认 schema 可能改变。执行前重新验证账号、目标和权限摘要,与审批时不一致就自动拒绝。

同一连接并发多个弹窗时,每个请求显示唯一编号和来源,批准一个不能触发队列中其他写入。

桌面会话被锁定时

屏幕锁定、应用进入后台或窗口不可见时,不应允许快捷键或默认焦点批准。待确认操作继续倒计时并最终拒绝。

系统从睡眠恢复后,所有过期请求保持拒绝,不能因计时器暂停获得额外有效期。

远程桌面与共享账号会削弱“点击代表真实用户”的假设。敏感生产写入应再要求系统身份验证或双人批准。

模型重复提交怎么办

Agent 可能把超时当成网络失败并重试,产生多个相同弹窗。服务用 SQL 哈希、连接和短时间窗口识别重复请求。

重复项可以合并显示,但每次批准只能对应一次执行。数据库写入尽量使用幂等键或业务唯一约束,防止响应丢失后重复修改。

达到弹窗频率阈值后暂停该客户端并提示用户检查提示与任务,不让批准界面形成拒绝服务。

审批体验的可访问性

Approve 与 Reject 按钮在位置、颜色和默认焦点上明确区分,键盘操作不能让回车无意批准。默认动作始终是拒绝。

长 SQL 使用等宽文本、语法高亮和可搜索视图,仍完整展示,不能用省略号隐藏 WHERE 尾部或第二条语句。

对屏幕阅读器提供目标、风险和影响范围的结构化标签,同时避免把敏感参数朗读到不安全环境。

上线检查清单

确认 MCP 默认关闭状态已由用户明确启用,保持 127.0.0.1,bearer token 已生成并受保护。

确认只暴露批准连接,生产名称清晰,数据库账号最小权限,读取和写入凭据尽量分离。

确认 run_query 受回滚、只读与 500 行限制,副作用读取和执行计划边界已经测试。

确认 execute_statement 每次弹出完整 SQL,60 秒自动拒绝,批准绑定不可变请求且不可重放。

确认审计已开启、哈希链定期验证、日志脱敏并备份到独立位置。

Data Peek 的方案把 Agent 写入变成“提出请求,用户在桌面确认,服务才执行”的明确状态机。默认关闭、localhost、bearer token、读取回滚、500 行上限、60 秒自动拒绝和哈希链审计共同降低风险。真正可靠的生产边界还要加入数据库最小权限、影响预览、连接隔离与审计外部留存,让一次错误批准也不会获得无限数据库能力。

相关文章

精彩推荐