Oracle SQLcl MCP Server 可以执行哪些 SQL 和 PL/SQL 操作?

作者:袖梨 2026-09-13

Oracle SQLcl MCP Server 把 Oracle SQLcl 的数据库能力封装成标准 MCP 工具,让 Claude Desktop、Cline、GitHub Copilot 等支持 MCP 的客户端通过自然语言连接 Oracle Database。它可以发现保存连接、建立和断开连接、执行 SQL 查询与 PL/SQL 代码块、运行 SQLcl 专用命令并读取当前模式信息。

这些能力并不限于只读分析。run-sql 可以执行普通 SQL 和 PL/SQL,run-sqlcl 可以调用 SQLcl 扩展;最终权限取决于保存连接对应的数据库用户,以及 SQLcl Restrict Level。若连接账户能建表、改数据或执行高权限过程,AI 客户端也可能获得相同能力。

安全起点是保持默认 Restrict Level 4,这是 MCP 模式最严格的级别,会禁止主机命令、脚本和其他敏感操作。同时为 MCP 单独创建最小权限 Oracle 用户,只保存必要连接,不把 DBA 或应用所有者账户暴露给客户端。

SQLcl MCP Server 如何工作

用户先在 MCP 客户端中提出自然语言要求,例如查询 HR 模式中上月入职的员工。客户端识别意图,调用模型生成相应 SQL,再发出结构化 MCP 工具调用。

SQLcl MCP Server 接收工具参数,通过 Oracle SQLcl 和已经保存的命名连接执行数据库操作。SQLcl 把结果交回 MCP Server,服务按协议格式化,再由客户端整理成自然语言或表格。

模型生成 SQL,SQLcl 执行 SQL,Oracle Database 根据用户权限决定是否允许。MCP 协议只负责标准化工具连接,不会自动把危险命令变安全。

当前提供的五个核心工具

list-connections 用于发现本机保存的 Oracle Database 连接;connect 选择一个命名连接并建立会话;disconnect 终止当前活动连接;run-sql 执行 SQL 查询与 PL/SQL 代码块;run-sqlcl 执行 SQLcl 特有命令和扩展;schema-information 返回当前连接模式的详细信息。

官方列表实际包含六个名称,其中连接生命周期由三个工具承担,数据库执行由两个工具承担,模式发现由一个工具承担。实际客户端展示名称与参数应以安装版本为准。

工具表面简单,但 run-sql 与 run-sqlcl 的能力很宽。部署者应分别测试每种工具在 Restrict Level 4 和数据库最小权限下的真实行为。

list-connections 能做什么

list-connections 枚举 SQLcl connection store 中已经保存的 Oracle 连接。连接存储位于用户的 .dbtools 目录,MCP 客户端只能发现运行 SQLcl 的同一操作系统用户可见的连接。

连接名称本身可能泄露环境和业务信息,例如 prod-payments 或 customer-identity。命名应便于区分环境,但不要包含密码、客户姓名或内部机密。

只在专用服务账户的 connection store 中保存允许暴露的连接。不要让 MCP 进程以日常 DBA 用户运行,否则 list-connections 可能展示该用户积累的所有生产连接。

connect 与 disconnect 的边界

connect 根据用户指定的命名连接建立活动数据库会话。模型不应接收任意连接字符串或明文密码,而应从预先批准的连接集合中选择。

建立连接后,后续 run-sql、run-sqlcl 和 schema-information 都针对当前会话。操作前让 Agent 回报连接名称、数据库服务、当前用户与当前 schema,避免把测试命令发到生产环境。

disconnect 主动终止当前连接。任务结束、切换环境或出现异常时应先断开。关闭聊天窗口不一定等于数据库会话立即消失,需结合客户端生命周期和数据库会话坚控验证。

run-sql 可以执行哪些内容

run-sql 能执行 SELECT 等标准 SQL 查询,也能提交 INSERT、UPDATE、DELETE、DDL 等语句,只要 Restrict Level、客户端审批和数据库用户权限允许。官方描述没有把它限定为只读工具。

它还可以运行 PL/SQL 匿名块和调用存储过程。PL/SQL 能循环、处理异常、调用包、写表、发起网络请求或执行管理动作,能力通常比单条查询更广。

因此不能只扫描 SQL 开头是否为 SELECT。安全控制应由数据库账户、角色、对象权限、存储过程 EXECUTE 权限和资源限制共同实现。

run-sqlcl 可以执行哪些内容

run-sqlcl 面向 SQLcl 专用命令与扩展,例如格式化、脚本控制、环境设置和 SQLcl 提供的附加功能。具体可用命令取决于 SQLcl 版本与 Restrict Level。

SQLcl 命令可能访问本地文件、运行脚本或调用宿主机功能,因此风险不仅在数据库。默认 Level 4 正是为了禁止主机命令、脚本与其他敏感操作。

如果业务只需要结构查看和只读查询,可以在客户端禁用 run-sqlcl,或通过工具策略要求人工批准。不要为了偶尔执行脚本而把长期服务降到 Level 0。

schema-information 提供什么

schema-information 返回当前连接模式的详细信息,帮助模型理解表、列和对象关系,再生成更准确的 SQL。它适合模式探索、代码生成、迁移分析和文档整理。

模式元数据也可能敏感。表名、列名、注释、约束和过程签名能够暴露业务模型、安全设计和个人数据位置。只读账户也应限制到批准 schema。

对大型模式,先按目标缩小范围,避免一次把全部结构送入模型上下文。元数据输出同样可能进入客户端日志或模型服务。

环境要求

Oracle 26.1 文档要求 SQLcl 25.2.0 或更高版本,以及 Java Runtime Environment 17 或 21。开始前检查实际命令使用的 Java 与 SQLcl:

java -version
sql -version

不要只检查系统默认 Java;MCP 客户端启动的进程可能使用不同 PATH 和 JAVA_HOME。配置中尽量写 SQLcl 可执行文件的绝对路径,并在客户端环境中验证。

版本升级可能改变工具参数、限制行为和命令支持。生产环境固定经过验证的 SQLcl 和 JRE 版本,升级前在测试数据库复跑权限与 Restrict Level 测试。

命名连接保存在哪里

SQLcl MCP Server 依赖预配置连接,connection store 默认位于运行用户的 .dbtools 目录。连接可以通过 connect 与 connmgr 命令管理,也可以在 Oracle SQL Developer Extension for VS Code 中定义。

要让 MCP 客户端使用连接,官方说明需要保存密码。创建连接时使用 savepwd 选项,把凭据安全保存到 connection store,而不是写进 MCP JSON 配置。

.dbtools 目录应只有运行用户可读,不能同步到公共云盘、加入 Git 或打包到支持附件。工作站丢失或用户离职时要撤销数据库密码,并清理保存连接。

创建 MCP 可用的保存连接

在 SQLcl 中创建命名连接的形式如下,示例值必须替换,操作时避免录屏和共享终端历史:

conn -save reporting_mcp -savepwd
report_reader/replace-with-secret@//dbhost:1521/service

连接名称应明确环境与权限,例如 dev_schema_reader、test_migration_proposer。不要把同名连接在不同电脑指向不同环境,否则模型和操作者难以判断目标。

创建后手工连接,查询当前数据库、用户和 schema,再验证允许与拒绝操作。不能仅凭保存成功就接入 Agent。

为 MCP 创建最小权限 Oracle 用户

只读分析场景应创建专用数据库用户或 schema,并只授予 CREATE SESSION 与目标对象 SELECT。不要授予 DBA、RESOURCE、ANY 系列对象权限或不受控角色。

CREATE USER mcp_reader IDENTIFIED BY "replace-with-strong-secret";
GRANT CREATE SESSION TO mcp_reader;
GRANT SELECT ON app.orders TO mcp_reader;
GRANT SELECT ON app.customers_masked TO mcp_reader;

Oracle 对角色、直接授权、过程权限和 definer rights 有复杂语义。若允许 PL/SQL,逐个评估包和过程,不要授予 EXECUTE ANY PROCEDURE。

敏感表优先通过脱敏视图暴露,只选择 Agent 需要的列。数据库账户看不到原值,比要求模型不输出更可靠。

PL/SQL 为什么需要额外控制

PL/SQL 可以调用数据库包、动态 SQL、调度器、网络 ACL、文件目录对象和 Java 存储过程。即使没有直接表写权限,高权限过程也可能通过定义者权限执行敏感操作。

检查 mcp 用户拥有的 EXECUTE 授权以及 PUBLIC 角色可执行的包。撤销不需要的权限,并使用 invoker rights 或受审查包装过程限制参数和对象范围。

对允许调用的过程建立输入验证、审计和资源限制。不要让 Agent 自由调用通用动态 SQL 过程。

默认 Restrict Level 4

SQLcl MCP 模式在未指定 -R 参数时默认使用最严格的 Level 4。该级别禁止宿主机命令、脚本和其他潜在敏感操作。

{
  "mcpServers": {
    "sqlcl": {
      "command": "/opt/sqlcl/bin/sql",
      "args": ["-mcp"]
    }
  }
}

默认值是安全起点,但它不把数据库连接自动变成只读。run-sql 对数据库的能力仍取决于用户授权。Level 4 主要缩小 SQLcl 与本机命令面。

Restrict Level 1 允许什么

官方示例使用 -R 1 允许通过 @ 和 @@ 执行脚本,同时继续阻止 host 命令:

"args": ["-R", "1", "-mcp"]

脚本可以包含多条 SQL、PL/SQL 和 SQLcl 命令,也可以引用其他脚本。开放后应限制脚本目录、文件所有者和修改权限,防止 Agent 执行被篡改文件。

只有经过审查的迁移或演示场景才考虑 Level 1。日常查询保留 Level 4,并为脚本任务启动独立短期配置。

Restrict Level 0 的风险

-R 0 表示允许所有命令。它可能开放宿主机命令、脚本和完整 SQLcl 功能,使风险从数据库扩展到运行 SQLcl 的操作系统账户。

"args": ["-R", "0", "-mcp"]

长期生产 MCP 不应使用 Level 0。即使数据库账户只读,host 命令仍可能读取本地文件、访问网络或泄露 connection store。

确需全功能演示时,在无生产凭据、无敏感文件、网络受限的临时容器或虚拟机中运行,结束后销毁环境。

配置 Claude Desktop

Claude Desktop 通过配置文件启动 SQLcl。command 使用绝对路径,args 包含 -mcp;如果连接依赖 tnsnames.ora,可通过 TNS_ADMIN 指定配置目录。

{
  "mcpServers": {
    "sqlcl": {
      "command": "/opt/sqlcl/bin/sql",
      "args": ["-mcp"],
      "env": {"TNS_ADMIN": "/opt/oracle/network/admin"}
    }
  }
}

配置后重启客户端,在工具列表中确认 SQLcl 工具。不要把数据库密码或浅包明文嵌入 JSON;配置文件本身也要限制权限。

配置 Cline

Cline 在 VS Code 的 MCP 设置中使用相同启动方式:

{
  "mcpServers": {
    "sqlcl": {
      "command": "/opt/sqlcl/bin/sql",
      "args": ["-mcp"],
      "disabled": false
    }
  }
}

Cline 自身还需要配置模型提供商和 API 凭据。模型密钥与数据库凭据属于不同安全域,不应放在同一文件或共享给不必要扩展。

VS Code 工作区可能包含不可信仓库设置。优先使用用户级受控配置,并检查扩展发布者、权限和更新。

SQL Developer for VS Code 集成

已使用 SQL Developer for VS Code 和 GitHub Copilot 的用户可以由扩展自动设置 SQLcl MCP Server,不必手写启动配置。创建数据库连接后即可从 Copilot 使用相关工具。

自动配置减少路径错误,但不会替用户决定数据库权限。检查扩展实际暴露的保存连接、Restrict Level 和工具审批策略。

组织应统一扩展版本和可信发布者,禁止工作区静默降低限制级别。

一次安全的只读查询流程

先运行 list-connections,只选择名称明确的只读连接。connect 后查询当前用户与 schema,再用 schema-information 探索目标对象。

要求模型生成带明确列、过滤条件和行数限制的 SELECT。执行前查看完整 SQL,避免 SELECT 星号、全表扫描和敏感字段。

查看结果后 disconnect,并检查数据库审计。模型的自然语言总结应与原始结果核对,不能把推测当成数据库事实。

一次受控的 PL/SQL 流程

只允许调用经过审查的包和过程,参数类型、对象范围与副作用必须明确。先在测试库使用同一权限角色运行。

对会写数据的 PL/SQL 要求独立审批、事务计划和回滚方案。执行后验证行数、审计和业务约束,不依赖模型自行判断成功。

动态 SQL、自治事务、外部网络和调度器调用属于高风险,默认拒绝在对话式 MCP 中执行。

脚本执行的安全边界

Level 1 开放 @ 与 @@ 后,脚本路径可能成为输入。把批准脚本放入只读目录,由受信任账户拥有,MCP 运行用户只有读取权限。

脚本中不能包含明文密码、host 命令、任意 include 或环境跳转。固定哈希或版本,并在执行前展示计划。

不要允许从仓库新生成的未审查脚本立即执行。Agent 可以提出脚本修改,但审批和执行应分离。

资源与性能控制

合法 SELECT 也可能消耗大量 CPU、I/O、TEMP 和会话。为 MCP 用户配置 Resource Manager 计划、会话限制和查询超时,并连接报告副本或测试库。

要求先查看执行计划和索引信息,再运行大型分析。结果集设置行数与大小上限,避免把百万行送进模型上下文。

PL/SQL 循环与并行查询更需限制。发现长时间运行时由数据库管理员从受控工具终止,不让模型反复重试。

数据隐私与模型边界

查询结果会从 Oracle Database 经过 SQLcl、MCP 客户端和模型服务。即使数据库连接加密,数据进入模型上下文后的处理仍受模型提供商配置影响。

只查询业务所需列,对个人信息和密钥使用脱敏视图。禁止把生产访问令牌、密码哈希、私钥和完整客户记录发送给外部模型。

检查客户端日志、聊天历史和遥测保留策略。数据库审计记录谁查询了什么,MCP 客户端日志记录工具调用,两者需要关联。

常见问题排查

工具列表中看不到 SQLcl

检查 command 绝对路径、SQLcl 和 JRE 版本、JSON 语法与客户端日志。重启客户端后再确认,不要通过降低系统安全设置解决。

list-connections 没有目标连接

确认连接保存在 MCP 进程同一用户的 .dbtools 中,并使用 savepwd。不要把普通 SQL Developer 的未保存会话误认为 SQLcl 命名连接。

连接成功但查询被拒绝

检查数据库用户对象权限、角色是否在当前会话生效、当前 schema 和同义词。不要直接授予 DBA,应由管理员补充最小对象权限。

脚本命令不能执行

默认 Level 4 会阻止脚本,这是预期安全行为。确需执行时使用隔离配置评估 Level 1,不要直接切到 Level 0。

查询跑错环境

立即断开,停止后续操作,检查保存连接名称与目标服务。审查数据库日志和可能的变更,重新命名连接并增加执行前环境确认。

撤销与卸载

不再允许某个客户端访问时,先禁用 MCP 配置并关闭客户端,删除对应命名连接,再轮换或锁定数据库用户。

检查 .dbtools 中是否仍保存凭据,确认其他工具没有依赖后再清理。删除文件前记录目标路径,不做宽泛递归删除。

数据库侧撤销 CREATE SESSION 和对象权限,审查近期登录与查询。仅卸载 SQLcl 不能使已经泄露的数据库密码失效。

上线检查清单

确认 SQLcl 至少为 25.2.0,JRE 为 17 或 21,客户端使用绝对路径;默认 args 只有 -mcp,未无意配置 -R 0。

确认命名连接只属于专用系统用户,密码安全保存;数据库账户遵循最小权限,不是 DBA、对象所有者或共享应用账户;PL/SQL EXECUTE 授权逐个审查。

确认敏感数据通过视图脱敏,查询有资源限制,MCP 与数据库审计启用;客户端工具审批不会自动允许高风险 run-sql 或 run-sqlcl。

Oracle SQLcl MCP Server 的价值在于把成熟 SQLcl 能力通过统一工具接给 AI 客户端。它既能查询 SQL,也能执行 PL/SQL 与 SQLcl 命令,能力强意味着边界必须更严。保留 Level 4、使用专用最小权限连接、限制工具和数据范围,才能在自动化效率与 Oracle 数据库安全之间取得平衡。

相关文章

精彩推荐