DBC Tech Academy / Oracle / 中級

SQLcl MCP Server で
Oracle Database を
Claude につなぐ権限と監査つきの AI 問い合わせ環境を組み、組織の認可付き接続へ育てる

「先月の受注で、納期遅れが集中している取引先を教えて」と Claude に日本語で聞き、Claude が SQL を書いて Oracle Database に流し、結果を表と文章で返す。この動きは、Oracle が SQLcl に同梱した MCP サーバー (SQLcl MCP Server) で今日から実現できます。Claude はデータベースに直接つながるのではなく、MCP (Model Context Protocol) を通じて SQLcl に「この SQL を実行して」と頼み、SQLcl が保存済みの接続でデータベースにつなぎます。したがって Claude にできることは接続した Oracle ユーザーの権限そのものであり、実行した SQL は Oracle 側の表とセッション情報に、モデル名つきで残ります。米国では 2025 年 7 月にこの形が出てから 1 年で、接続は PC のローカルから組織の ID 基盤で認可するリモート MCP へ、AI に渡すものは自由な SQL から承認済みのツールへと進みました。この講座では、Claude Desktop と Claude Code の両方から問い合わせられる環境の組み方を、試験用の Oracle Database Free から会社のデータベースへ向ける順で示し、権限・監査・運用を決め、そこから次の段階へ上がる条件までを扱います。

sqlcl / dbtools$mcp_log
SQL> SELECT id, mcp_client, model, end_point_name, 2 log_message FROM dbtools$mcp_log; ID CLIENT MODEL TOOL LOG_MESSAGE --- ------ --------------- ---------- -------------------- 3 Claude claude-sonnet-4 connect Connect to HR 4 Claude claude-sonnet-4 run-sql select /* LLM in use is Claude Sonnet 4 */ * from employees 5 Claude claude-sonnet-4 run-sqlcl info employees 6 Claude claude-sonnet-4 disconnect Disconnect from HR

接続から切断までの 4 回のツール呼び出しが 1 行ずつ残り、どのクライアント(Claude)がどのモデル(claude-sonnet-4)で何を実行したかが分かります。SQL 本文にもモデル名のコメントが入るので、V$SQL・ASH・AWR のどこから見ても AI の問い合わせだと分かります。

出典: Oracle SQLcl User's Guide, Monitoring the SQLcl MCP Server

01 / Finished setup

完成形

読み終えたとき、読者の手元にできているものを先に見せます。Claude が日本語の問いから SQL を組み立て、SQLcl が保存済みの接続で Oracle Database に流し、結果が Claude に戻って表と文章になり、実行の記録がクライアント名とモデル名つきで Oracle 側に残る。この 4 段が、1 つの .mcp.json と 1 人の Oracle ユーザーで動いている状態です。

4 段Claude → MCP → SQLcl → Oracle

Claude は SQL を書く側。実行は SQLcl、権限と記録は Oracle。

MCP は Claude とツールの間の共通の呼び出し方式で、SQLcl は MCP サーバーとして「接続一覧・接続・切断・スキーマ情報・SQL 実行・SQLcl コマンド実行」の 6 つのツールを Claude に見せます。Claude が受け取るのは SQL の実行結果のテキストだけで、パスワードもデータベースへの経路も Claude を通りません。したがって、Claude にできることは接続した Oracle ユーザーの権限そのものであり、AI が何をしたかの正本は Oracle 側にあります。

読者の日本語の質問 → Claude が SQL を組み立て run-sql を呼ぶ → SQLcl が保存済み接続で実行(MODULE にクライアント名、ACTION にモデル名) → 結果のテキストが Claude に返る → Claude が表と文章で答える。記録は DBTOOLS$MCP_LOG と統合監査に残る

SQLcl は Oracle 純正のコマンドライン (Oracle SQL Developer Command Line) で、25.2 以降に MCP サーバーが同梱されました。Claude Desktop の設定に数行足すだけで動きます。接続先の Oracle Database は 19c 以降なら Free、Standard Edition 2、Enterprise Edition のどれでも同じ手順です。

Oracle で組む利点

AI に自由に SQL を書かせる以上、統制はデータベースの側に要ります。Claude 側の設定は読者の PC にあり、変えられる人が多い。Oracle 側の権限・監査・上限は DBA だけが変えられ、どのクライアントから来ても一律に効きます。Oracle Database はその統制が製品の中に揃っている点で、AI エージェントを迎える側として有利です。右の 6 行は、02 準備で見る 4 段階のどの接続経路に進んでもそのまま残り、以降の節はこの表を 1 行ずつ実装していきます。

この講座で組む環境の試験には Oracle AI Database 26ai Free のコンテナを使います。同じエンジンなので、権限・監査・Resource Manager・SQL Firewall の挙動は会社の 19c や 26ai と同じ場所に現れます。

統制の 6 行と、Oracle での実装

統制Oracle での実装効くもの
実行できる SQL の範囲ユーザー権限、SQL Firewall の許可リスト(23ai 以降。19c での組み方は 09)想定外の SQL を実行前に止める
渡ってよいデータビュー、Data Redaction、Virtual Private DatabaseClaude に渡る結果から列・行を除く
誰が・どのモデルでV$SESSION の MODULE / ACTION、SQL コメントAI の SQL を人の SQL と見分ける
何を実行したか統合監査、DBTOOLS$MCP_LOG改変されない記録を DB の側に持つ
使える資源の上限Resource Manager(MODULE 単位の割り当て)重い集計で他の業務を止めない
DBA からの隔離Database Vault のレルム管理者権限からも対象スキーマを守る

スキーマ探索

「受注テーブルの列と、外部キーで結ばれている表を教えて」。辞書を読んで ER 図まで起こします。

実行計画と AWR

「この SQL が遅い理由を実行計画で説明して」「直近 1 時間の待機イベント上位 5 つ」。長い出力の要点だけを返します。

DDL と移行の下書き

「この表の DDL を出して、PostgreSQL 向けに変わる型と構文を一覧に」。移行見積もりの初回の洗い出しに使えます。

ロードと Liquibase

「この CSV をステージング表に読み込んで」「変更ログの内容を説明して」。書き込みを含むので、別の接続ユーザーで許します。

02 / Decisions first

準備

工程に入る前に決めることが 5 つあります。接続経路、Claude に見せるデータ、接続に使う Oracle ユーザー、Claude の入口、環境要件です。順に見ていきましょう。

接続経路の 4 段階

Oracle が Claude との接続に用意している経路は、資格情報の置き場所と認可の主体で 4 段の階段になっています。上の段ほど、組織として配りやすくなります。

  1. pathSQLcl MCP サーバー

    読者の PC か踏み台サーバーで SQLcl が動く。この講座で組む段です。

    who authorizes

    PC に保存した DB ユーザーの資格情報。

    available when

    SQLcl 25.2 以降。DB の場所(オンプレミス・IaaS・OCI・Autonomous)とバージョン(19c 以降)を問いません。

  2. pathORDS MCP サーバー

    自社が立てた ORDS(スタンドアロン)が、streamable HTTP の MCP エンドポイントになる。

    who authorizes

    自社の ID 基盤(Microsoft Entra ID、Keycloak、OCI IAM など)が発行する JWT。

    available when

    ORDS 26.2 以降。オンプレミスの DB にそのまま向けられます。

  3. pathOCI マネージド MCP(Database Tools MCP)

    OCI の管理サービスが MCP エンドポイントを提供する。

    who authorizes

    OCI IAM の OAuth 2.0。Administrator / Operator / User の 3 役割。

    available when

    DB が OCI 上、または Oracle AI Database@AWS / @Azure / @Google Cloud にあるとき。

  4. pathAutonomous AI Database 内蔵 MCP + Select AI Agent

    データベース自身が MCP サーバーを持ち、中に定義したツールをエージェントに見せる。

    who authorizes

    Oracle Database Identity。

    available when

    Autonomous AI Database(19c / 26ai)を使っているとき。

この講座は 1 段目で組みます。理由は 2 つあります。無償で今日再現できる唯一の段であること、そして専用ユーザー・見せる表・記録の正本という 03〜09 節の判断が、上の段にそのまま持ち上がることです。上の段で変わるのは「資格情報をどこに置き、誰が認可するか」と「AI に渡すものが自由な SQL か承認済みのツールか」の 2 点で、10 米国での使われ方と次の段階で対応表にします。

自社が今どの段に居られるかは、DB の所在(オンプレミス / IaaS / OCI / Autonomous)、ORDS の有無、ID 基盤の有無(Entra ID など)の 3 点で判定できます。オンプレミス 19c と Entra ID を持つ組織は、1 段目から始めて 2 段目に上がる道筋になります。

Oracle 側の統制は、段を上がっても残る

専用ユーザー、ビュー、統合監査、Resource Manager、SQL Firewall は Oracle Database の中にあるので、接続経路が SQLcl から ORDS や OCI に変わっても、そのまま効き続けます。1 段目で DB 側を丁寧に組むほど、上の段への移行は軽くなります。

Select AI (DBMS_CLOUD_AI) はデータベースの中から LLM を関数として呼ぶ仕組みで、Claude を「使う側」として組むこの講座とは向きが逆です。SQL の中で LLM を呼びたい用途はそちらになります。

対象データを決める

Claude に見せる表の一覧を先に書き出します。判断の基準は「その表の中身が Claude との会話に含まれてよいか」です。SQL の実行結果は MCP を通って Claude に渡り、会話の一部になります。権限を絞る理由は「書けるか」ではなくここにあります。個人情報の列を含む表は、列を除いたビューを対象にします。

書き出した一覧の各表に、所有者・含まれる個人情報の列・見せる形(表そのまま / ビュー)の 3 列を付けておくと、03 データベース側の用意の GRANT 文がそのまま書けます。

この講座の対象

表個人情報の列見せる形
OE.ORDERSなし表そのまま
OE.ORDER_ITEMSなし表そのまま
OE.CUSTOMERS氏名・メール・電話取引先名だけのビュー
OE.PRODUCTSなし表そのまま
HR.EMPLOYEES氏名・メール・電話列を除いたビュー

接続ユーザーと Claude の入口を決める

Claude 専用の Oracle ユーザーを 1 つ作る

既存のアプリケーション用ユーザーや DBA のユーザーを流用すると、記録上で人の操作と AI の操作が混ざります。ユーザー名は、監査ログを読む人が AI だと分かる名前にします。この講座では MCP_READER です。書き込みを含む用途(ロード、Liquibase)には別のユーザーを作り、接続名も分けます。

Claude Desktop と Claude Code

画面で会話しながら調べる DBA・情報システム担当は Claude Desktop(設定は claude_desktop_config.json)、ターミナルで開発しながら DB を見る開発者は Claude Code(プロジェクトの .mcp.json か claude mcp add)が向きます。どちらも同じ SQLcl MCP サーバーを起こすので、両方登録してよいです。組織で配るときは、Claude Desktop は組織の管理設定、Claude Code はプロジェクトの .mcp.json をリポジトリに入れます。

環境要件を確かめる

SQLcl は sql -V で版を確かめます。25.2 以降で MCP サーバーが動きますが、この講座は 2026 年 7 月の 26.2 の挙動で書いています。MCP のツール数と制限レベルの既定は版で変わるので(26.1.2 で既定が変わりました)、04 SQLcl と接続の保存は現行版の前提です。Java は 17 / 21 / 25 のいずれかを java -version で確かめます。

試験用のデータベースは Oracle AI Database 26ai Free のコンテナイメージで用意し、サンプルスキーマは Oracle の db-sample-schemas から OE(受注)と HR(人事)を入れます。本文の例(OE.ORDERS の納期遅れ、HR.EMPLOYEES の個人情報の列)はこの 2 スキーマを前提に書いています。

試験用データベースを起こす

-- コンテナイメージの取得には Oracle Container Registry のログインが 1 回要る docker run -d --name oracle-free -p 1521:1521 \ -e ORACLE_PWD=:sys_password \ container-registry.oracle.com/database/free:latest -- 起動後、FREEPDB1 に OE / HR のサンプルスキーマを入れる git clone https://github.com/oracle-samples/db-sample-schemas.git

03 / Database user

データベース側の用意

Claude が使う Oracle ユーザーを作り、見せる表に読み取り権限を付け、個人情報の列を除いたビューを用意します。SQLcl が実行の記録を残す表の置き場所も、ここで決まります。

最小権限ユーザーを作る

CREATE USER mcp_reader IDENTIFIED BY :password DEFAULT TABLESPACE users QUOTA 50M ON users; GRANT CREATE SESSION TO mcp_reader; GRANT CREATE TABLE TO mcp_reader; -- DBTOOLS$MCP_LOG を自分のスキーマに作るため GRANT SELECT ON oe.orders TO mcp_reader; GRANT SELECT ON oe.order_items TO mcp_reader; GRANT SELECT ON oe.products TO mcp_reader;

CREATE TABLE と表領域の割り当て (QUOTA) は、SQLcl が初回接続時に DBTOOLS$MCP_LOG を接続ユーザーのスキーマに作るために要ります。この 2 つが無いと、接続と問い合わせは成功するのに記録が残らず、後から気付くことになります(11 症例演習の 3 例目)。

個人情報の列を除いたビュー

CREATE VIEW oe.customers_for_ai AS SELECT customer_id, cust_first_name || ' ' || cust_last_name AS customer_name, account_mgr_id, credit_limit FROM oe.customers; GRANT SELECT ON oe.customers_for_ai TO mcp_reader; CREATE VIEW hr.employees_for_ai AS SELECT employee_id, department_id, job_id, hire_date, salary FROM hr.employees; GRANT SELECT ON hr.employees_for_ai TO mcp_reader;

メールアドレスと電話番号を除いたビューを対象にすると、Claude に渡る結果からその列が消えます。Enterprise Edition の Data Redaction が使える環境では、ビューの代わりにポリシーで列をマスクしてもよいです。取引先名は「納期遅れが多い取引先」の答えに要るので、ビューに残しています。

Claude はスキーマを探索するために ALL_TABLES ALL_TAB_COLUMNS ALL_CONSTRAINTS を読みます。これらは権限のある表だけが見えるビューなので、追加の権限は要りません。実行計画や V$ ビューを読ませたいときだけ GRANT SELECT ANY DICTIONARY を足します。これは辞書全体が見える権限なので、足すかどうかは 09 ガバナンスと運用の統制と合わせて決めます。

確かめ方は 1 つです。mcp_reader で接続し、SELECT owner, table_name FROM all_tables WHERE owner IN ('OE','HR') と ALL_VIEWS の結果が、02 節で書き出した一覧と一致することを見ます。

権限の 3 段階

用途付ける権限
問い合わせだけCREATE SESSION、CREATE TABLE + QUOTA、対象の SELECT
実行計画・AWR も上に加えて SELECT ANY DICTIONARY
ロード・Liquibase別ユーザー(例 MCP_LOADER)に、ステージング表の INSERT と Liquibase の管理表

04 / SQLcl setup

SQLcl と接続の保存

SQLcl に接続を名前で保存し、AI 用の接続を人の接続と別の置き場所に分け、制限レベルを決めて MCP サーバーを起こします。Claude が知るのは接続の名前だけです。

接続は conn -save で名前を付けて保存します。-savepwd を付けると資格情報が保存され、MCP サーバーがその名前で接続できるようになります。Claude が知るのは接続名 oe_readonly だけで、パスワードは Claude との会話にも設定ファイルにも現れません。TNS 別名で接続する環境では、TNS_ADMIN を MCP サーバーの環境変数に渡します。

AI 用の接続は、人が普段使う接続と別の置き場所に分けます。SQLcl 25.4 以降の -home で接続の保存先ディレクトリを指定でき、sql -home ~/.dbtools-mcp /nolog で保存した接続だけを sql -home ~/.dbtools-mcp -mcp が見ます。人の接続(DBA 権限や本番の接続を含む)が Claude の接続一覧に並ぶことがなくなり、AI に渡した接続がディレクトリ 1 つで棚卸しできます。

-savepwd で保存した接続は、その PC で sql -mcp を起こせる人なら誰でも使えます。-home のディレクトリの権限を所有者だけの読み書きにし、共用 PC と踏み台サーバーでは OS のユーザーごとに保存してください。この「資格情報が PC にある」ことが 1 段目の限界で、10 の 2 段目以降で ID 基盤に移ります。

接続を保存して、MCP サーバーを起こす

-- AI 用の置き場所を指定して SQLcl を起こし、接続を保存する $ sql -home ~/.dbtools-mcp /nolog SQL> conn -save oe_readonly -savepwd \ mcp_reader/:password@//localhost:1521/FREEPDB1 SQL> exit -- 保存した接続だけを見る MCP サーバーを、制限レベルを明示して起こす $ sql -home ~/.dbtools-mcp -R 4 -mcp ---------- MCP SERVER STARTUP ---------- MCP Server started successfully on ... Press Ctrl+C to stop the server

通信は標準入出力 (stdio) だけで、ネットワークのポートは開きません。1 つの sql -mcp プロセスが持てる接続は 1 本です。普段は Claude が起こすので、手で起こすのはこの確認のときだけです。

制限レベルを決める

制限レベルは sql -R <n> -mcp で明示します。SQLcl 26.1.2 以降、sql -mcp だけで起こすと無制限(レベル 0)で始まり、OS コマンドもファイル保存も run-sqlcl から通ります。26.1.1 までは既定がレベル 4 だったので、古い手順書のまま -R を省いて更新すると統制が外れます。レベル 4 は OS コマンド・ファイル保存・スクリプト実行と 100 以上の SQLcl コマンドを止めます。run-sqlcl で awr や load、Liquibase を使うときはレベルを下げます。

判断の軸: レベルは「Claude に SQLcl のどのコマンドを許すか」であり、データベースの権限とは別の層です。データベース側で SELECT しか許していなければ、レベル 1 でも更新は通りません。逆にレベル 0 では、Claude が run-sqlcl から host コマンドで MCP サーバーが動く PC の OS コマンドを実行できます。DB の権限が効くのは DB の中だけなので、PC 側の統制はこのレベルだけが担います。

制限レベルと使う場面

レベル止まるもの使う場面
4ホストコマンド、ファイル保存、スクリプト実行、多数の SQLcl コマンドSQL の問い合わせだけを許す。問い合わせ用の登録はこれを明示する
3ホストコマンド、ファイル保存、スクリプト実行書式設定と DDL 生成まで
2ホストコマンド、ファイル保存awr などの参照コマンドまで
1ホストコマンドload と Liquibase まで
0なし(26.1.2 以降の既定)Claude に OS コマンドまで渡る。登録には常に -R を書く

05 / Register in Claude

Claude への登録

Claude Desktop と Claude Code に、SQLcl の MCP サーバーを登録します。どちらも「SQLcl を -mcp で起こす」設定を書くだけで、Claude 側には接続名もパスワードも書きません。

Claude Desktop

claude_desktop_config.json(macOS は ~/Library/Application Support/Claude/、Windows は %APPDATA%\Claude\)に足します。command は which sql で得た絶対パスにします。

{ "mcpServers": { "sqlcl": { "command": "/opt/sqlcl/bin/sql", "args": ["-home", "/Users/taro/.dbtools-mcp", "-R", "2", "-mcp"], "env": { "TNS_ADMIN": "/opt/oracle/network/admin" } } } }

Claude Desktop を再起動し、入力欄の横のツールアイコンに sqlcl と 6 つのツールが並ぶことを確かめます。

Claude Code

コマンド 1 行で登録し、claude mcp list で確かめます。プロジェクトで共有するときは .mcp.json に同じ内容を書いてリポジトリに入れます。接続先のホスト名もパスワードも入らないので、リポジトリに置けます。

$ claude mcp add sqlcl /opt/sqlcl/bin/sql -- \ -home /Users/taro/.dbtools-mcp -R 2 -mcp $ claude mcp list sqlcl: /opt/sqlcl/bin/sql -home ... -R 2 -mcp - ✓ Connected

Claude Code は settings.json の permissions.allow / deny で、mcp__sqlcl__run-sql を常に許可し mcp__sqlcl__run-sqlcl は都度確認、のように分けられます。Claude Desktop は MCP のツールを呼ぶたびに読者の許可を求め、「この会話では許可」を選べます。

6 つのツール

ツールClaude が何をするか読者が知っておくこと
list-connections保存済み接続の名前を一覧するClaude が選べるのはここに出る名前だけ。-home で分けた置き場所の中だけが並ぶ
connect名前を指定して接続する1 サーバーにつき同時 1 接続
disconnect接続を閉じる会話の終わりに Claude 自身が呼ぶ
schema-information接続先のスキーマ(表・列・制約)を要約して返す。他スキーマの指定と絞り込みができるClaude が辞書を 1 つずつ引く回数が減る。見えるのは権限のある対象だけ
run-sqlSQL と PL/SQL を実行する。長い処理はバックグラウンドに投げて job-id で後から結果を取れるSQL にモデル名のコメント /* LLM in use is ... */ が付く
run-sqlclSQLcl のコマンド(info、ddl、awr、load、lb など)を実行する制限レベルで許された範囲だけ動く

06 / Query and traces

問い合わせの流れと痕跡

1 回の日本語の問い合わせを例に、Claude・MCP・SQLcl・Oracle の 4 段を順に通る様子と、Oracle 側に残る記録を、Oracle 公式ドキュメントの出力で読み解きます。自分の環境で 07 動作確認の手順を流したとき、ここで読んだ場所に同じ形の記録が現れます。

流れ: 日本語の問いが SQL になり、結果が戻るまで

例にする問いは「oe_readonly に接続して、先月の受注のうち約束納期より遅れて出荷した件数が多い取引先を上位 10 件出してください」です。

Claude が書く SQL を読むときに見る点は 3 つあります。件数の絞り込み(FETCH FIRST 10 ROWS ONLY のように、結果がコンテキストに入るので Claude は自分で件数を絞る癖があります)、期間の解釈(「先月」が ADD_MONTHS(TRUNC(SYSDATE,'MM'), -1) のような式に出ます。月初から月末までか、30 日前からかは式を読めば分かり、答えの数字の意味がここで決まります)、結合の向きと集計の単位(「取引先ごと」が customer_name か customer_id かで、同名の取引先の扱いが変わります)です。

Claude の答えは、この SQL を読んで初めて「何を数えた数字か」が確定します。答えの表だけを会議に持ち込む前に、SQL の 3 点を読む習慣を付けておくと、11 症例演習の 2 例目のような食い違いを防げます。

Claude が呼ぶツールの順

  1. list-connections で接続名を知る
  2. connect で oe_readonly に接続する
  3. schema-information で列と制約を確かめる
  4. run-sql で本命の SQL を流す
  5. 表と説明文で答え、disconnect で閉じる

痕跡 1: DBTOOLS$MCP_LOG

SQL> SELECT id, mcp_client, model, end_point_type, end_point_name, log_message 2 FROM dbtools$mcp_log; ID MCP_CLIENT MODEL END_POINT_TYPE END_POINT_NAME LOG_MESSAGE --- ---------- ---------------- -------------- -------------- ---------------------------------- 3 Claude claude-sonnet-4 tool connect Connect to HR 4 Claude claude-sonnet-4 tool run-sql select /* LLM in use is Claude Sonnet 4 */ * from employees 5 Claude claude-sonnet-4 tool run-sqlcl info employees 6 Claude claude-sonnet-4 tool disconnect Disconnect from HR -- 出典: Oracle SQLcl User's Guide, Monitoring the SQLcl MCP Server
列入るもの読み方
ID連番1 行が 1 回のツール呼び出し
MCP_CLIENTクライアント名(Claude)Claude Desktop・Claude Code・VS Code の区別はここで付く
MODELモデル名(claude-sonnet-4)モデルを更新した前後で SQL の傾向を比べる鍵
END_POINT_NAMEconnect / run-sql / run-sqlcl / disconnect などrun-sqlcl の行があれば、制限レベルで許した SQLcl コマンドが使われた
LOG_MESSAGE実行した SQL か SQLcl コマンドの本文実行が失敗した呼び出しも、試みた文がここに残る

この表は接続ユーザーのスキーマに作られ、そのユーザー自身が消せます。改変されない記録の正本は統合監査の側に置きます(09)。

痕跡 2: V$SESSION と V$SQL

V$SESSION の MODULE には MCP クライアントの識別子、ACTION には LLM の名前が入ります。同じユーザーでもクライアントごとに見分けられ、09 の Resource Manager の振り分けはこの MODULE の値で行います。V$SQL をコメントで絞ると AI が実行した SQL だけが並び、DBA_HIST_ACTIVE_SESS_HISTORY にも MODULE ACTION が残るので、AWR の期間で振り返れます。実行計画は DBMS_XPLAN.DISPLAY_CURSOR(sql_id) で、人が書いた SQL と同じ手順で読めます。

DBA が見る 2 つの問い合わせ

-- 今つながっている AI のセッション SELECT sid, username, module, action, status, sql_id FROM v$session WHERE username = 'MCP_READER'; -- AI が実行した SQL だけを並べる SELECT sql_id, executions, elapsed_time/1000 AS elapsed_ms, sql_text FROM v$sql WHERE sql_text LIKE '%/* LLM in use is%' ORDER BY last_active_time DESC;

痕跡 3: 権限で止まった操作

「ORDERS の 1 件目の状態を出荷済みに更新してください」と頼むと、Claude は UPDATE を組み立てて run-sql を呼び、Oracle が ORA-01031: insufficient privileges を返します。Claude はそのエラーを読んで「このユーザーには更新権限がありません」と答えます。

ここで見る点は 2 つです。止めたのは Claude の判断ではなく Oracle の権限であること。そして DBTOOLS$MCP_LOG の LOG_MESSAGE と統合監査には、試みた UPDATE 文が残ること。AI が「やろうとして止められた操作」が記録に残るのは、人の操作と同じ扱いです。

止まる場所と、残る場所

Claude が試みたこと止める層残る場所
権限のない表の SELECTOracle(ORA-00942)MCP_LOG、統合監査
UPDATE / INSERTOracle(ORA-01031)MCP_LOG、統合監査
許可リスト外の SQL(23ai 以降)SQL Firewall(ORA-47605)MCP_LOG、DBA_SQL_FIREWALL_VIOLATIONS
見積もりの重い集計Resource Manager(ORA-07455)MCP_LOG、統合監査
run-sqlcl の hostSQLcl の制限レベルMCP_LOG

この節の出力は Oracle SQLcl User's Guide「Monitoring the SQLcl MCP Server」からの引用です。MCP_CLIENT と MODULE に入る文字列、DBTOOLS$MCP_LOG の列は SQLcl のバージョンで増えることがあるので、自分の環境では DESC dbtools$mcp_log で列を確かめてください。

07 / Verification

動作確認

02 節で決めた基準を 4 つの確認に落とします。それぞれ Claude への問いかけと、期待する結果、Oracle 側で見る場所を並べます。見る場所は 06 節で読み解いた 3 つの痕跡です。

確認Claude への問いかけ期待する結果Oracle 側で見る場所
見せる表だけが見える「見えるテーブルとビューを全部一覧して」02 節の一覧と一致するALL_TABLES と ALL_VIEWS を MCP_READER で引いた結果
個人情報の列が渡らない「従業員の名前とメールアドレスを出して」「その列は見えません」と返すHR.EMPLOYEES_FOR_AI の定義
更新が通らない「テスト用に 1 行 INSERT して」ORA-01031 を受けて断るDBTOOLS$MCP_LOG に INSERT 文が残る
記録が残る(上の 3 つを行ったあと)呼び出し回数と行数が一致するSELECT COUNT(*) FROM mcp_reader.dbtools$mcp_log

4 つがそろったら、接続先を試験用データベースから会社のデータベース(読み取り用の複製かスタンバイ)に切り替えます。切り替えは conn -save で別名を保存するだけで、Claude 側の設定はそのままです。この 4 確認は、10 で上の段に移ったときも同じ文言で使います。変わるのは「Oracle 側で見る場所」の列に ID 基盤の監査ログが足されることだけです。

大きな表への SELECT は、読み取りでも CPU と I/O を使います。Claude は件数を絞る傾向がありますが、集計や結合は表全体を読みます。会社のデータベースに向ける前に、09 の Resource Manager で MODULE ごとの上限を決めておいてください。

切り替えの 3 行

$ sql -home ~/.dbtools-mcp /nolog SQL> conn -save oe_readonly -savepwd \ mcp_reader/:password@//standby.example.co.jp:1521/ORCLPDB -- 同じ名前で上書きすれば、Claude 側の設定はそのまま

試験用と会社用を同時に持ちたいときは oe_readonly_dev のように名前を分けます。Claude は名前を見て接続を選ぶので、名前が接続先の説明になります。

08 / Everyday use

実務での使い方

Claude が Oracle につながって変わることを、DBA と開発者の日常の 6 場面で見ていきます。上の 3 つは読み取り専用ユーザーと制限レベル 2 で足り、下の 3 つは書き込みを含むので別の接続名と別のユーザーを使います。

  1. スキーマ探索と ER 図read / -R 4

    「ORDERS を中心に外部キーで結ばれた表を列挙して、Mermaid の ER 図にして」。Claude は schema-information と ALL_CONSTRAINTS を読んで図を返します。仕様書が古い現場で、現物のスキーマから関係を起こす作業が数分になります。確かめる点は、図に出た関係を 1 つ ALL_CONSTRAINTS で引いて突き合わせることです。図の読み方は ER 図の読み方で扱っています。

  2. 実行計画の読み解きread / SELECT ANY DICTIONARY

    「この SQL の実行計画を DBMS_XPLAN.DISPLAY_CURSOR で出して、どこで時間を使っているか説明して」。V$SQL_PLAN を読むために SELECT ANY DICTIONARY が要ります。Claude は見積もり件数と実件数のずれを指し、統計の再収集か索引の追加かを提案します。提案された索引は、Claude ではなく読者が試験環境で試します。

  3. AWR と待機イベントread / -R 2

    「直近 1 時間の AWR レポートを出して、上位の待機イベントを説明して」。run-sqlcl の awr コマンドを使うので制限レベル 2 以下と SELECT ANY DICTIONARY、AWR には Enterprise Edition の Diagnostics Pack が要ります。長い AWR レポートを Claude に読ませて要点だけ返させる使い方が、この経路の中で最も時間を返します。

  4. DDL 生成と移行の下書きread / -R 3

    「OE スキーマの表の DDL を出して、PostgreSQL に持っていくときに変わる型と構文を一覧にして」。run-sqlcl の ddl コマンドで DDL を取り、Claude が翻訳します。PostgreSQL への移行案件の初回見積もりで、対象の表数と厄介な型(NUMBER の精度なし、DATE の時刻、VARCHAR2 のバイト単位)を洗い出す使い方です。

  5. データロードwrite / -R 1

    「この CSV を STG_ORDERS に読み込んで、読めなかった行を報告して」。run-sqlcl の load コマンドで制限レベル 1 が要ります。読み込み先は INSERT 権限を持つステージング表に限り、03 節の読み取り専用ユーザーとは別のユーザー(MCP_LOADER)で保存した接続を使います。

  6. Liquibasewrite / -R 1

    「この変更ログの内容を説明して、lb update の前に影響を受ける表を列挙して」。run-sqlcl の lb コマンドで制限レベル 1 が要ります。適用そのものは人が承認してから流す運用にし、Claude には内容の説明と lb status の読み解きを任せます。

接続名と MCP サーバーの登録を、用途で分ける

問い合わせ用は oe_readonly を -R 4 で、AWR 用は同じユーザーを -R 2 で、ロード用は stg_loader を -R 1 で、3 つの MCP サーバーとして別名(sqlcl-read sqlcl-awr sqlcl-load)で登録します。Claude は用途に合ったサーバーを選び、読者は Claude Desktop の許可画面で「どのサーバーのツールか」を見て判断できます。

09 / Governance

ガバナンスと運用

統制は Claude 側・SQLcl 側・Oracle 側の 3 層に分かれます。Claude 側と SQLcl 側は読者の PC にあり、設定を変えられる人が多い。Oracle 側の権限・監査・上限は DBA だけが変えられ、どのクライアントから来ても効きます。だから統制は Oracle 側に厚く置きます。

Claude 側

組織プラン、データ保持、MCP サーバーとツール呼び出しの許可、モデルの固定。

SQLcl 側

保存接続の名前と -home の置き場所、制限レベル、ディレクトリの権限。

Oracle 側

ユーザー権限、ビュー / Redaction / VPD、統合監査、Resource Manager、SQL Firewall、Database Vault。

Claude 側

組織プランと配布

  • 組織プランで使います。Claude for Work の Team / Enterprise、または API 経由。会話の内容が学習に使われない契約の範囲で、データ保持の期間を組織の方針に合わせます。
  • Team / Enterprise では、組織のオーナーがデスクトップ拡張と MCP の許可一覧を管理できます。Claude Desktop の設定は MDM(Jamf、Intune など)の構成プロファイルで配れるので、読者の PC で任意の MCP サーバーを足せる状態にするかは組織の判断になります。
  • Claude Code は管理設定で MCP サーバーの許可・拒否リストを配れます。settings.json の permissions で mcp__sqlcl__run-sql を許可し、mcp__sqlcl__run-sqlcl を都度確認にします。

通信の経路

Amazon Bedrock か Google Cloud Vertex AI 経由の Claude を使う組織では、Claude との通信が自社のクラウドアカウントの中で完結します。Claude Code はどちらにも切り替えられ、SQLcl 側の設定は変わりません。

モデル名は ACTION と SQL コメントに残るので、組織でモデルを固定しているかどうかを Oracle 側から確かめられます。

SQLcl 側

  • 保存接続の名前を「用途_権限」で付けます(oe_readonly stg_loader)。Claude は名前を見て接続を選ぶので、名前が権限の説明になります。
  • 制限レベルは接続の用途ごとに MCP サーバーの登録を分け、常に -R を明示します。問い合わせ用は -R 4、AWR 用は -R 2、ロード用は -R 1。26.1.2 以降は -R を省くと無制限で起きます。
  • AI 用の接続は -home で人の接続と別のディレクトリに置き、そのディレクトリは所有者だけの読み書きにします。踏み台サーバーでは OS ユーザーを分けます。

Oracle 側

統合監査: 記録の正本

CREATE AUDIT POLICY mcp_reader_all ACTIONS ALL; AUDIT POLICY mcp_reader_all BY mcp_reader;

UNIFIED_AUDIT_TRAIL の SQL_TEXT に /* LLM in use is ... */ が残るので、監査ログの側からも AI の SQL を抽出できます。DBTOOLS$MCP_LOG は接続ユーザーのスキーマにあり、そのユーザー自身が消せるので、改変されない記録の正本は統合監査の側に置きます。監査ポリシーは接続を作る前に有効にします(11 の 3 例目)。

Resource Manager: MODULE 単位の上限

BEGIN DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING( attribute => DBMS_RESOURCE_MANAGER.MODULE_NAME, value => 'Claude', -- 自環境の V$SESSION.MODULE の値に合わせる consumer_group => 'AI_QUERIES'); END; /

AI_QUERIES のプラン・ディレクティブに MAX_EST_EXEC_TIME を置くと、見積もりの実行時間が上限を超える SQL は実行前に ORA-07455 で止まります。読み取りでも重い集計を Claude が投げたときの保険になります。CPU の割合も同じディレクティブで決めます。

SQL Firewall(23ai 以降): 許可リスト

-- 動作確認の期間に実行された SQL を捕捉する BEGIN DBMS_SQL_FIREWALL.CREATE_CAPTURE( username => 'MCP_READER', top_level_only => TRUE, start_capture => TRUE); END; / -- 期間が終わったら、捕捉した SQL を許可リストにして有効化する BEGIN DBMS_SQL_FIREWALL.STOP_CAPTURE('MCP_READER'); DBMS_SQL_FIREWALL.GENERATE_ALLOW_LIST('MCP_READER'); DBMS_SQL_FIREWALL.ENABLE_ALLOW_LIST( username => 'MCP_READER', enforce => DBMS_SQL_FIREWALL.ENFORCE_SQL, block => TRUE); END; /

許可リストにない SQL は ORA-47605 で止まり、違反が DBA_SQL_FIREWALL_VIOLATIONS に残ります。

権限とビューは 03 節のとおりです。Enterprise Edition では Data Redaction のポリシーで列をマスクし、Virtual Private Database (VPD) で行を絞れます。Database Vaultは Enterprise Edition のオプションで、レルムで OE スキーマを囲い、MCP_READER を参加者にすると、DBA 権限を持つ他のユーザーからも守れます。金融・医療のように監査要件が厳しい組織で使います。

19c で組むとき。読者の多くが使う 19c には SQL Firewall がありません。19c では「実行できる SQL の範囲」を、オブジェクト権限とビューで対象を絞ること、統合監査で実行された文を全件残すこと、Resource Manager で MODULE ごとの実行時間と CPU の上限を置くことの 3 つで組みます。実行前に止める層だけが欠けるので、その代わりに統合監査の SQL_TEXT を日次で集計し、対象外の表やスキーマへの参照が現れたら接続ユーザーの権限を見直す運用にします。Data Redaction・VPD・Database Vault は 19c の Enterprise Edition でも使えます。

判断の軸: 「AI が書いた SQL を実行前に止めたい」が要件になった時点で、26ai への更新が統制の側から動機づけられます。26ai は 19c の次の長期サポート版で、2026 年 1 月の Release Update からオンプレミスの Linux に提供されています(10)。

定型の問い合わせを承認済みの形に固定する

Claude に自由な SQL を書かせる使い方と、決まった問い合わせを Claude に任せる使い方は、統制の形が違います。後者は SQL を先に承認しておけます。

判断の軸: 「日本語で自由に聞く」用途(スキーマ探索、実行計画、障害の調査)は SQL Firewall を捕捉のままにして違反を記録します。「毎日同じ問いを投げる」用途(日次の集計、決まった帳票、監視の確認)は、動作確認の期間に捕捉した SQL を許可リストとして有効化し、それ以外を止めます。用途ごとに接続ユーザーを分ければ、1 つの DB で両方を同時に運用できます。

この「承認済みの SQL だけを AI に渡す」形は、10 で見る OCI マネージド MCP の SQL レポート(パラメータ付きの検証済み SQL)と同じ思想です。1 段目の環境で SQL Firewall を使って先に運用しておくと、上の段に移るときに許可リストの中身がそのままレポートの候補になります。

運用で決めておくこと

  • DBTOOLS$MCP_LOG は自動で消えません。保持日数を決め(例: 90 日)、日次のジョブで DELETE します。統合監査の側に正本があるので、この表は短くてよいです。
  • 保存接続のパスワードは組織のローテーション周期に合わせて conn -save で上書きします。
  • モデルの更新は ACTION と SQL コメントに残るので、生成される SQL の傾向が変わったかを V$SQL のコメントで前後比較できます。
  • SQLcl は月次で更新され、MCP のツールと既定値が変わります(25.3.1 で schema-information 追加、25.4 で -home と非同期 run-sql、26.1.2 で制限レベルの既定が無制限に)。更新後に claude mcp list でツール一覧を見て、登録の -R が効いていることと 07 節の 4 確認をもう一度流します。
  • 費用。SQLcl と MCP サーバーは Oracle Database のライセンスに含まれ、追加費用はありません。Claude 側の費用は会話のトークン量で、結果の行数がそのまま入力トークンになります。FETCH FIRST で絞る習慣を Claude の指示(Claude Desktop のプロジェクト設定か Claude Code の CLAUDE.md)に書きます。

10 / Where this is heading

米国での使われ方と次の段階

1 段目で組んだ環境がこの先どう置き換わるかを、米国で先に起きている事実で見ていきます。2025 年 7 月に SQLcl の MCP サーバーが出てから 1 年で、接続は PC のローカルから組織の ID 基盤で認可するリモート MCP へ、AI に渡すものは自由な SQL から承認済みのツールへ、使う主体は人からエージェントへと進みました。

1 年で起きたこと

  1. SQLcl 25.2 リリース。MCP サーバーが同梱されるClaude Desktop から Oracle に SQL を流す最初の形。資格情報は PC の中
  2. Oracle AI World(ラスベガス)で Oracle AI Database 26ai を発表。プレスリリースに MCP 対応と、Autonomous AI Database 内でエージェントとツールを定義する Select AI Agent の計画が載るデータベース自身が MCP のエンドポイントになる方向が公式に示される
  3. Anthropic が MCP を Linux Foundation 傘下の Agentic AI Foundation に寄贈。仕様上のリモート MCP の OAuth 2.1 認可は同年 6 月 18 日版で確定済み「PC のローカルツール」から「組織が配る認可付きエンドポイント」へ、業界の足場が中立の団体に定まる
  4. Autonomous AI Database の内蔵 MCP サーバーが一般提供。19c / 26ai の両方に対応データベースごとに MCP サーバーが付き、認可は Oracle Database Identity
  5. 26ai Enterprise Edition がオンプレミスの Linux x86-64 に一般提供(1 月の Release Update 23.26.1)オンプレミスでも 26ai 世代(SQL Firewall、AI Vector Search)が始まる
  6. OCI マネージド MCP(Database Tools MCP)が OCI 上の全 Oracle Database と Oracle AI Database@AWS / @Azure / @Google Cloud に対応OAuth 2.0 と OCI IAM で認可し、Administrator / Operator / User の 3 役割。User は事前定義のパラメータ付き SQL レポートだけを呼べる
  7. ORDS 26.2 が streamable HTTP の MCP サーバーになる自社が立てた ORDS が、Entra ID や Keycloak の JWT で認可するリモート MCP になる。ツールは list-databases run-sql schema-information。オンプレミスの DB に向けられる

3 つの方向

資格情報を PC に置く 組織の ID 基盤で認可する

1 段目では -home のディレクトリにパスワードがあり、PC を触れる人がそのまま接続できます。2 段目以降では Claude が MCP エンドポイントに接続すると 401 と認可先の案内が返り、読者は普段のシングルサインオンでログインし、JWT を持って接続します。誰が接続したかは ID 基盤の監査ログに人の名前で残ります。ORDS MCP では接続したセッションの SYS_CONTEXT に OAuth の発行者・principal・アプリケーションロールが入るので、Oracle 側でも人を識別でき、VPD の行の絞り込みを人ごとに書けます。退職者のアカウントを止めれば接続も止まります。

AI に自由な SQL を書かせる 承認済みのツールを渡す

3 段目の役割 3 段は、この移行を役割で表しています。Administrator がツールセットと SQL レポート(検証済みのパラメータ付き SQL)を定義し、Operator は run-sql の自由な SQL とレポートの両方を使え、User はレポートだけを呼びます。現場の大多数は User になります。1 段目で SQL Firewall の許可リストを運用しておくと、その中身がレポートの候補になります(09)。

人が Claude で聞く エージェントが DB のツールを呼ぶ

4 段目の Select AI Agent は、データベースの中にツール(PL/SQL、REST、他の MCP サーバー)を定義し、エージェントが自律的に呼ぶ枝組みです。Oracle はこれを Private Agent Factory と組み合わせ、複数のエージェントが DB を介して連携する構成を出しています。Claude 側でも同じ方向で、Claude Code のサブエージェントや Claude Agent SDK から MCP を呼ばせる形が整っています。人が画面で聞く使い方は残りますが、日次の集計や監視の確認は、エージェントが定刻にレポートを呼んで Slack に流す形に寄っていきます。

1 段目で組んだものが、各段でどう置き換わるか

1 段目(この講座)2 段目 ORDS MCP3 段目 OCI マネージド MCP4 段目 Autonomous 内蔵 MCP
-home の保存接続ORDS の接続プール + ID 基盤の JWTOCI Database Tools Connections + OCI IAM の OAuth 2.0Oracle Database Identity
sql -mcp(stdio)https://ords.example.co.jp/mcp(streamable HTTP)OCI が提供する MCP エンドポイントデータベースの MCP エンドポイント
run-sql で自由な SQLrun-sql と schema-information(スキーマの認可は ORDS、人の識別は SYS_CONTEXT)Operator は run-sql、User は SQL レポートSelect AI Agent のツール
制限レベルORDS の認可設定役割 3 段ツール定義と権限
DBTOOLS$MCP_LOG + 統合監査ID 基盤のログ + 統合監査OCI 監査 + 統合監査Autonomous の監査 + 統合監査
専用ユーザー、ビュー、Resource Manager、SQL Firewallそのままそのままそのまま

最後の行が、この講座で組む価値です。Oracle 側の統制は接続経路が変わっても残ります。日本の組織の多くは 1 段目から 2 段目への移行が次の一歩になります。2 段目は米国でも 2026 年夏に出たばかりで、日本との時差は小さいです。

次の段に上がる条件

  • 2 段目へ。Claude を使う人が 5 人を超え、PC ごとに conn -save を配るのが運用として回らなくなったとき。Entra ID か Keycloak があれば、ORDS 26.2 をスタンドアロンで立てるだけで上がれます。オンプレミスの 19c にそのまま向けられます。
  • 3 段目へ。DB が OCI か Database@AWS / @Azure / @Google Cloud にあり、現場の大多数に自由な SQL ではなくレポートだけを渡したいとき。
  • 4 段目へ。Autonomous AI Database を使っていて、人ではなくエージェントに DB のツールを呼ばせたいとき。

この節の時系列は Oracle と Anthropic の公式発表・リリースノートの日付です。各段の対応表は 2026 年 9 月時点の製品仕様で、ORDS と OCI マネージド MCP のツール名・役割名は今後の版で増えることがあるので、移行を検討する時点の公式ドキュメントで確かめてください。

11 / Read the symptom

症例演習

環境を組んだ直後に持ち込まれる症状 3 例です。いずれも理解のための架空の状況です。 症状と最初に見る場所から、原因を当ててみましょう。

12 / Myth vs. reality

よくある勘違い

どれも一見もっともらしく、経験のある DBA ほど言いがちな判断です。

MISCONCEPTION 01

「Claude がデータベースに直接つながっている」

つながっているのは SQLcl で、Claude は SQL 文を渡して結果のテキストを受け取るだけです。だから権限は Oracle ユーザーで効き、パスワードは Claude に渡らず、記録は Oracle 側に残ります。06 問い合わせの流れと痕跡の 4 段の図で、Claude が触れているのがツール名と引数の JSON だけであることを確かめてください。

MISCONCEPTION 02

「読み取り専用にすれば統制は済んでいる」

結果は Claude との会話に入ります。見せる表と列を決めるのは「書けるか」ではなく「Claude に渡ってよいか」で判断します。加えて読み取りでも重い集計は動くので、Resource Manager の上限が要ります。02 準備の対象データの表と、09 ガバナンスと運用の MAX_EST_EXEC_TIME がこの 2 点に対応しています。

MISCONCEPTION 03

「接続経路を上の段に移せば、DB 側の設計はやり直しになる」

上の段で変わるのは、資格情報の置き場所と認可の主体、そして AI に渡すものが自由な SQL か承認済みのツールかの 2 点です。専用ユーザー・ビュー・統合監査・Resource Manager・SQL Firewall はそのまま残り、SQL Firewall の許可リストは上の段のレポートの候補になります。10 米国での使われ方と次の段階の対応表の最後の行がそれです。1 段目で DB 側を丁寧に組むほど、上の段への移行は軽くなります。

13 / Knowledge check

理解度チェック

答えを当てるだけでなく、なぜそう判断できるのかを説明できれば合格です。

YOUR PROGRESS 01 / 10

選択肢を1つ選んでください。

Take it home

見せる表を決めてから、
認可付きの接続へ

見せる表を決める会話に含まれてよいか
専用ユーザー最小権限とビュー
保存して登録-home と -R を明示
痕跡を読むMCP_LOG・V$SESSION・統合監査
統制を置く監査・上限・許可リスト
次の段へID 基盤の認可

Claude と Oracle Database をつなぐ作業は、SQLcl の設定を数行書けば終わります。時間をかけるべきなのはその前と後です。前は「どの表を Claude との会話に含めてよいか」を決めて専用ユーザーの権限に落とすこと、後は「誰が・どのモデルで・何を実行したか」を Oracle 側の記録で追える形にし、重い集計と想定外の SQL を DB の中で止めることです。

この DB 側の設計は、接続経路が SQLcl から ORDS や OCI に変わっても残ります。利用者が増えて PC ごとの接続配布が回らなくなったとき、ORDS 26.2 と自社の ID 基盤で 2 段目に上がる。定型の問い合わせを許可リストに固定しておいたなら、その中身が上の段のレポートになる。1 段目を丁寧に組むことが、そのまま次の段への準備になります。

ほかの講座を見る

参考資料

自社の Oracle Database に Claude をつなぐ際の権限の切り方、監査の設計、既存システムとの接続範囲、ID 基盤で認可する接続への移行を検討する際は、お問い合わせフォームよりご相談ください。