浏览 AI 知识库
数据库 MCP 先用只读账号验证什么,再考虑写权限
数据库 MCP 第一次接入应使用只读账号和限定 schema,先检查表结构与查询行为。只有明确业务需要、审批和回滚条件时,才讨论写权限。
按实际操作顺序推进
每完成一段就检查当前输出,确认结果符合预期后再继续。
为了看一张表结构,没必要让工具拿到生产管理员账号
数据库 MCP 直接使用生产管理员账号,只为查看一张表结构。一次错误工具调用就可能修改或删除真实数据。
- 环境、角色和 schema 最小化
- 写入反例被拒绝
- 查询成本与结果均验证
动手前,把材料和不能改的部分定下来
| 需要确认 | 本例内容 |
|---|---|
| 现有材料 | 测试环境 PostgreSQL,只读角色 `mcp_reader`,仅授权 reporting schema;目标查询最近 10 条脱敏订单。 |
| 不能越过的边界 | 先只读账号与非生产环境;限制 schema、行数、超时和成本;写权限需要新的风险评审和人工确认。 |
| 要交付的结果 | 只读角色、查询结果与升级条件 |
数据库 MCP 怎么用,从“创建最小角色”开始做
创建最小角色
只授予目标库的 SELECT 或更窄视图,限制来源网络、并发、超时和可见字段。
准备测试查询
从版本、当前库、表结构或限制行数的非敏感查询开始,不运行全表导出。
检查结果与日志
确认账号、目标实例、实际 SQL、行数、耗时和错误,敏感值在日志和模型输出中脱敏。
验证写操作被拒绝
在安全测试对象上确认 INSERT/UPDATE/DELETE 不可用,不能只相信权限名称。
定义升级条件
若任务确需写入,另建受限角色、事务、预览、审批、备份和回滚,不直接给管理员权限。
第一次连接使用脱敏测试库、专用只读账号和两条小查询
| 输入项 | 教学环境中的实际值 | 安全边界 |
|---|---|---|
| 目标环境 | PostgreSQL 16 测试副本;数据库 analytics_test | 不连接生产实例,不复用管理员账号 |
| 账号与范围 | analytics_reader;仅 reporting schema 的 SELECT | 密码通过本地密钥环境提供,不写进提示或配置截图 |
| 允许对象 | reporting.monthly_orders_masked 视图 | 姓名、手机号和完整订单明细不可见 |
| 身份查询 | `SELECT current_database(), current_user, version();` | 核对实际数据库、账号和版本 |
| 样本查询 | `SELECT month, order_count FROM reporting.monthly_orders_masked ORDER BY month DESC LIMIT 20;` | 限制字段与行数,记录耗时和请求 ID |
| 拒写测试 | 在隔离测试对象尝试 INSERT | 应返回权限拒绝,且复查行数无变化 |
主机、账号和对象为教学输入。真实凭证不得进入文章、提示、截图或仓库,拒写测试也只能在获准的隔离对象进行。
从当前库和表结构开始,不从全表导出开始
| 查询 | 限制 | 验收 | 禁止 |
|---|---|---|---|
| 身份 | 返回当前数据库、用户和版本 | 与目标实例一致 | 不能只看连接成功 |
| 结构 | 读取指定 schema 的表名 | 只显示允许范围 | 不列出其他库和系统表 |
| 样本 | `SELECT ... LIMIT 20` 的脱敏视图 | 行数、耗时和字段可回查 | 不导出完整敏感列 |
| 写测试 | 安全测试表尝试 INSERT | 权限拒绝且无行变化 | 不在生产对象试写 |
SQL 仅为方法示例;真实字段、schema、账号和脱敏策略由数据负责人确认。
完成后的只读角色、查询结果与升级条件
验证 `current_user` 为 mcp_reader,UPDATE/DELETE 被拒绝;SELECT 仅能访问 reporting,查询带 LIMIT 10 与 statement timeout。结果与数据库客户端同查询一致,连接串未出现在日志。
为什么“账号只读,查询仍拖垮数据库”还不能交付
账号只读,查询仍拖垮数据库
- 原因
- 大扫描和笛卡尔积不需要写权限也有风险
- 怎么改
- 增加超时、行数与资源限制,先 EXPLAIN 或在副本测试
