「Claude がデータベースに直接つながっている」
つながっているのは SQLcl で、Claude は SQL 文を渡して結果のテキストを受け取るだけです。だから権限は Oracle ユーザーで効き、パスワードは Claude に渡らず、記録は Oracle 側に残ります。06 問い合わせの流れと痕跡の 4 段の図で、Claude が触れているのがツール名と引数の JSON だけであることを確かめてください。
DBC Tech Academy / Oracle / 中級
「先月の受注で、納期遅れが集中している取引先を教えて」と 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 から会社のデータベースへ向ける順で示し、権限・監査・運用を決め、そこから次の段階へ上がる条件までを扱います。
接続から切断までの 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 ユーザーで動いている状態です。
MCP は Claude とツールの間の共通の呼び出し方式で、SQLcl は MCP サーバーとして「接続一覧・接続・切断・スキーマ情報・SQL 実行・SQLcl コマンド実行」の 6 つのツールを Claude に見せます。Claude が受け取るのは SQL の実行結果のテキストだけで、パスワードもデータベースへの経路も Claude を通りません。したがって、Claude にできることは接続した Oracle ユーザーの権限そのものであり、AI が何をしたかの正本は Oracle 側にあります。
SQLcl は Oracle 純正のコマンドライン (Oracle SQL Developer Command Line) で、25.2 以降に MCP サーバーが同梱されました。Claude Desktop の設定に数行足すだけで動きます。接続先の Oracle Database は 19c 以降なら Free、Standard Edition 2、Enterprise Edition のどれでも同じ手順です。
AI に自由に SQL を書かせる以上、統制はデータベースの側に要ります。Claude 側の設定は読者の PC にあり、変えられる人が多い。Oracle 側の権限・監査・上限は DBA だけが変えられ、どのクライアントから来ても一律に効きます。Oracle Database はその統制が製品の中に揃っている点で、AI エージェントを迎える側として有利です。右の 6 行は、02 準備で見る 4 段階のどの接続経路に進んでもそのまま残り、以降の節はこの表を 1 行ずつ実装していきます。
この講座で組む環境の試験には Oracle AI Database 26ai Free のコンテナを使います。同じエンジンなので、権限・監査・Resource Manager・SQL Firewall の挙動は会社の 19c や 26ai と同じ場所に現れます。
| 統制 | Oracle での実装 | 効くもの |
|---|---|---|
| 実行できる SQL の範囲 | ユーザー権限、SQL Firewall の許可リスト(23ai 以降。19c での組み方は 09) | 想定外の SQL を実行前に止める |
| 渡ってよいデータ | ビュー、Data Redaction、Virtual Private Database | Claude に渡る結果から列・行を除く |
| 誰が・どのモデルで | V$SESSION の MODULE / ACTION、SQL コメント | AI の SQL を人の SQL と見分ける |
| 何を実行したか | 統合監査、DBTOOLS$MCP_LOG | 改変されない記録を DB の側に持つ |
| 使える資源の上限 | Resource Manager(MODULE 単位の割り当て) | 重い集計で他の業務を止めない |
| DBA からの隔離 | Database Vault のレルム | 管理者権限からも対象スキーマを守る |
「受注テーブルの列と、外部キーで結ばれている表を教えて」。辞書を読んで ER 図まで起こします。
「この SQL が遅い理由を実行計画で説明して」「直近 1 時間の待機イベント上位 5 つ」。長い出力の要点だけを返します。
「この表の DDL を出して、PostgreSQL 向けに変わる型と構文を一覧に」。移行見積もりの初回の洗い出しに使えます。
「この CSV をステージング表に読み込んで」「変更ログの内容を説明して」。書き込みを含むので、別の接続ユーザーで許します。
02 / Decisions first
工程に入る前に決めることが 5 つあります。接続経路、Claude に見せるデータ、接続に使う Oracle ユーザー、Claude の入口、環境要件です。順に見ていきましょう。
Oracle が Claude との接続に用意している経路は、資格情報の置き場所と認可の主体で 4 段の階段になっています。上の段ほど、組織として配りやすくなります。
読者の PC か踏み台サーバーで SQLcl が動く。この講座で組む段です。
PC に保存した DB ユーザーの資格情報。
SQLcl 25.2 以降。DB の場所(オンプレミス・IaaS・OCI・Autonomous)とバージョン(19c 以降)を問いません。
自社が立てた ORDS(スタンドアロン)が、streamable HTTP の MCP エンドポイントになる。
自社の ID 基盤(Microsoft Entra ID、Keycloak、OCI IAM など)が発行する JWT。
ORDS 26.2 以降。オンプレミスの DB にそのまま向けられます。
OCI の管理サービスが MCP エンドポイントを提供する。
OCI IAM の OAuth 2.0。Administrator / Operator / User の 3 役割。
DB が OCI 上、または Oracle AI Database@AWS / @Azure / @Google Cloud にあるとき。
データベース自身が MCP サーバーを持ち、中に定義したツールをエージェントに見せる。
Oracle Database Identity。
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 段目に上がる道筋になります。
専用ユーザー、ビュー、統合監査、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 | 氏名・メール・電話 | 列を除いたビュー |
既存のアプリケーション用ユーザーや DBA のユーザーを流用すると、記録上で人の操作と AI の操作が混ざります。ユーザー名は、監査ログを読む人が AI だと分かる名前にします。この講座では MCP_READER です。書き込みを含む用途(ロード、Liquibase)には別のユーザーを作り、接続名も分けます。
画面で会話しながら調べる 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 スキーマを前提に書いています。
03 / Database user
Claude が使う Oracle ユーザーを作り、見せる表に読み取り権限を付け、個人情報の列を除いたビューを用意します。SQLcl が実行の記録を残す表の置き場所も、ここで決まります。
CREATE TABLE と表領域の割り当て (QUOTA) は、SQLcl が初回接続時に DBTOOLS$MCP_LOG を接続ユーザーのスキーマに作るために要ります。この 2 つが無いと、接続と問い合わせは成功するのに記録が残らず、後から気付くことになります(11 症例演習の 3 例目)。
メールアドレスと電話番号を除いたビューを対象にすると、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 節で書き出した一覧と一致することを見ます。
| 用途 | 付ける権限 |
|---|---|
| 問い合わせだけ | CREATE SESSION、CREATE TABLE + QUOTA、対象の SELECT |
| 実行計画・AWR も | 上に加えて SELECT ANY DICTIONARY |
| ロード・Liquibase | 別ユーザー(例 MCP_LOADER)に、ステージング表の INSERT と Liquibase の管理表 |
04 / SQLcl setup
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 基盤に移ります。
通信は標準入出力 (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 Desktop と Claude Code に、SQLcl の MCP サーバーを登録します。どちらも「SQLcl を -mcp で起こす」設定を書くだけで、Claude 側には接続名もパスワードも書きません。
claude_desktop_config.json(macOS は ~/Library/Application Support/Claude/、Windows は %APPDATA%\Claude\)に足します。command は which sql で得た絶対パスにします。
Claude Desktop を再起動し、入力欄の横のツールアイコンに sqlcl と 6 つのツールが並ぶことを確かめます。
コマンド 1 行で登録し、claude mcp list で確かめます。プロジェクトで共有するときは .mcp.json に同じ内容を書いてリポジトリに入れます。接続先のホスト名もパスワードも入らないので、リポジトリに置けます。
Claude Code は settings.json の permissions.allow / deny で、mcp__sqlcl__run-sql を常に許可し mcp__sqlcl__run-sqlcl は都度確認、のように分けられます。Claude Desktop は MCP のツールを呼ぶたびに読者の許可を求め、「この会話では許可」を選べます。
| ツール | Claude が何をするか | 読者が知っておくこと |
|---|---|---|
list-connections | 保存済み接続の名前を一覧する | Claude が選べるのはここに出る名前だけ。-home で分けた置き場所の中だけが並ぶ |
connect | 名前を指定して接続する | 1 サーバーにつき同時 1 接続 |
disconnect | 接続を閉じる | 会話の終わりに Claude 自身が呼ぶ |
schema-information | 接続先のスキーマ(表・列・制約)を要約して返す。他スキーマの指定と絞り込みができる | Claude が辞書を 1 つずつ引く回数が減る。見えるのは権限のある対象だけ |
run-sql | SQL と PL/SQL を実行する。長い処理はバックグラウンドに投げて job-id で後から結果を取れる | SQL にモデル名のコメント /* LLM in use is ... */ が付く |
run-sqlcl | SQLcl のコマンド(info、ddl、awr、load、lb など)を実行する | 制限レベルで許された範囲だけ動く |
06 / Query and traces
1 回の日本語の問い合わせを例に、Claude・MCP・SQLcl・Oracle の 4 段を順に通る様子と、Oracle 側に残る記録を、Oracle 公式ドキュメントの出力で読み解きます。自分の環境で 07 動作確認の手順を流したとき、ここで読んだ場所に同じ形の記録が現れます。
例にする問いは「oe_readonly に接続して、先月の受注のうち約束納期より遅れて出荷した件数が多い取引先を上位 10 件出してください」です。
list-connections を呼び、connect(oe_readonly) で接続を頼みます。続けて schema-information で ORDERS と CUSTOMERS_FOR_AI の列と制約を読み、SQL を組み立てて run-sql を呼びます。Claude は列名を推測せず、先にスキーマを確かめます。見えるのは権限のある対象だけです。-home の置き場所から oe_readonly の資格情報を取り出して接続し、セッションの MODULE にクライアント名、ACTION にモデル名を入れます。受け取った SQL に /* LLM in use is <model> */ のコメントを付けて実行し、呼び出しを 1 行ずつ DBTOOLS$MCP_LOG に書きます。コメントは SQLcl が付けるので、Claude 側の指示で消えることはありません。ORA-00942、権限のない更新は ORA-01031 で止まり、Resource Manager の上限を超える見積もりは実行前に止まります。結果の行がテキストで SQLcl に戻り、そのまま Claude のコンテキストに入って会話の一部になります。DBTOOLS$MCP_LOG(ツール呼び出し 1 回 = 1 行)、V$SESSION の MODULE / ACTION、V$SQL と ASH / AWR に残るコメントつきの SQL、統合監査の UNIFIED_AUDIT_TRAIL。Claude は最後に表と説明文で答え、会話の終わりに disconnect を呼びます。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 例目のような食い違いを防げます。
list-connections で接続名を知るconnect で oe_readonly に接続するschema-information で列と制約を確かめるrun-sql で本命の SQL を流すdisconnect で閉じる| 列 | 入るもの | 読み方 |
|---|---|---|
ID | 連番 | 1 行が 1 回のツール呼び出し |
MCP_CLIENT | クライアント名(Claude) | Claude Desktop・Claude Code・VS Code の区別はここで付く |
MODEL | モデル名(claude-sonnet-4) | モデルを更新した前後で SQL の傾向を比べる鍵 |
END_POINT_NAME | connect / run-sql / run-sqlcl / disconnect など | run-sqlcl の行があれば、制限レベルで許した SQLcl コマンドが使われた |
LOG_MESSAGE | 実行した SQL か SQLcl コマンドの本文 | 実行が失敗した呼び出しも、試みた文がここに残る |
この表は接続ユーザーのスキーマに作られ、そのユーザー自身が消せます。改変されない記録の正本は統合監査の側に置きます(09)。
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 と同じ手順で読めます。
「ORDERS の 1 件目の状態を出荷済みに更新してください」と頼むと、Claude は UPDATE を組み立てて run-sql を呼び、Oracle が ORA-01031: insufficient privileges を返します。Claude はそのエラーを読んで「このユーザーには更新権限がありません」と答えます。
ここで見る点は 2 つです。止めたのは Claude の判断ではなく Oracle の権限であること。そして DBTOOLS$MCP_LOG の LOG_MESSAGE と統合監査には、試みた UPDATE 文が残ること。AI が「やろうとして止められた操作」が記録に残るのは、人の操作と同じ扱いです。
| Claude が試みたこと | 止める層 | 残る場所 |
|---|---|---|
権限のない表の SELECT | Oracle(ORA-00942) | MCP_LOG、統合監査 |
UPDATE / INSERT | Oracle(ORA-01031) | MCP_LOG、統合監査 |
| 許可リスト外の SQL(23ai 以降) | SQL Firewall(ORA-47605) | MCP_LOG、DBA_SQL_FIREWALL_VIOLATIONS |
| 見積もりの重い集計 | Resource Manager(ORA-07455) | MCP_LOG、統合監査 |
run-sqlcl の host | SQLcl の制限レベル | 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 ごとの上限を決めておいてください。
試験用と会社用を同時に持ちたいときは oe_readonly_dev のように名前を分けます。Claude は名前を見て接続を選ぶので、名前が接続先の説明になります。
08 / Everyday use
Claude が Oracle につながって変わることを、DBA と開発者の日常の 6 場面で見ていきます。上の 3 つは読み取り専用ユーザーと制限レベル 2 で足り、下の 3 つは書き込みを含むので別の接続名と別のユーザーを使います。
「ORDERS を中心に外部キーで結ばれた表を列挙して、Mermaid の ER 図にして」。Claude は schema-information と ALL_CONSTRAINTS を読んで図を返します。仕様書が古い現場で、現物のスキーマから関係を起こす作業が数分になります。確かめる点は、図に出た関係を 1 つ ALL_CONSTRAINTS で引いて突き合わせることです。図の読み方は ER 図の読み方で扱っています。
「この SQL の実行計画を DBMS_XPLAN.DISPLAY_CURSOR で出して、どこで時間を使っているか説明して」。V$SQL_PLAN を読むために SELECT ANY DICTIONARY が要ります。Claude は見積もり件数と実件数のずれを指し、統計の再収集か索引の追加かを提案します。提案された索引は、Claude ではなく読者が試験環境で試します。
「直近 1 時間の AWR レポートを出して、上位の待機イベントを説明して」。run-sqlcl の awr コマンドを使うので制限レベル 2 以下と SELECT ANY DICTIONARY、AWR には Enterprise Edition の Diagnostics Pack が要ります。長い AWR レポートを Claude に読ませて要点だけ返させる使い方が、この経路の中で最も時間を返します。
「OE スキーマの表の DDL を出して、PostgreSQL に持っていくときに変わる型と構文を一覧にして」。run-sqlcl の ddl コマンドで DDL を取り、Claude が翻訳します。PostgreSQL への移行案件の初回見積もりで、対象の表数と厄介な型(NUMBER の精度なし、DATE の時刻、VARCHAR2 のバイト単位)を洗い出す使い方です。
「この CSV を STG_ORDERS に読み込んで、読めなかった行を報告して」。run-sqlcl の load コマンドで制限レベル 1 が要ります。読み込み先は INSERT 権限を持つステージング表に限り、03 節の読み取り専用ユーザーとは別のユーザー(MCP_LOADER)で保存した接続を使います。
「この変更ログの内容を説明して、lb update の前に影響を受ける表を列挙して」。run-sqlcl の lb コマンドで制限レベル 1 が要ります。適用そのものは人が承認してから流す運用にし、Claude には内容の説明と lb status の読み解きを任せます。
問い合わせ用は 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 側に厚く置きます。
組織プラン、データ保持、MCP サーバーとツール呼び出しの許可、モデルの固定。
保存接続の名前と -home の置き場所、制限レベル、ディレクトリの権限。
ユーザー権限、ビュー / Redaction / VPD、統合監査、Resource Manager、SQL Firewall、Database Vault。
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 側から確かめられます。
oe_readonly stg_loader)。Claude は名前を見て接続を選ぶので、名前が権限の説明になります。-R を明示します。問い合わせ用は -R 4、AWR 用は -R 2、ロード用は -R 1。26.1.2 以降は -R を省くと無制限で起きます。-home で人の接続と別のディレクトリに置き、そのディレクトリは所有者だけの読み書きにします。踏み台サーバーでは OS ユーザーを分けます。UNIFIED_AUDIT_TRAIL の SQL_TEXT に /* LLM in use is ... */ が残るので、監査ログの側からも AI の SQL を抽出できます。DBTOOLS$MCP_LOG は接続ユーザーのスキーマにあり、そのユーザー自身が消せるので、改変されない記録の正本は統合監査の側に置きます。監査ポリシーは接続を作る前に有効にします(11 の 3 例目)。
AI_QUERIES のプラン・ディレクティブに MAX_EST_EXEC_TIME を置くと、見積もりの実行時間が上限を超える SQL は実行前に ORA-07455 で止まります。読み取りでも重い集計を Claude が投げたときの保険になります。CPU の割合も同じディレクティブで決めます。
許可リストにない 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 のコメントで前後比較できます。schema-information 追加、25.4 で -home と非同期 run-sql、26.1.2 で制限レベルの既定が無制限に)。更新後に claude mcp list でツール一覧を見て、登録の -R が効いていることと 07 節の 4 確認をもう一度流します。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 から承認済みのツールへ、使う主体は人からエージェントへと進みました。
list-databases run-sql schema-information。オンプレミスの DB に向けられる1 段目では -home のディレクトリにパスワードがあり、PC を触れる人がそのまま接続できます。2 段目以降では Claude が MCP エンドポイントに接続すると 401 と認可先の案内が返り、読者は普段のシングルサインオンでログインし、JWT を持って接続します。誰が接続したかは ID 基盤の監査ログに人の名前で残ります。ORDS MCP では接続したセッションの SYS_CONTEXT に OAuth の発行者・principal・アプリケーションロールが入るので、Oracle 側でも人を識別でき、VPD の行の絞り込みを人ごとに書けます。退職者のアカウントを止めれば接続も止まります。
3 段目の役割 3 段は、この移行を役割で表しています。Administrator がツールセットと SQL レポート(検証済みのパラメータ付き SQL)を定義し、Operator は run-sql の自由な SQL とレポートの両方を使え、User はレポートだけを呼びます。現場の大多数は User になります。1 段目で SQL Firewall の許可リストを運用しておくと、その中身がレポートの候補になります(09)。
4 段目の Select AI Agent は、データベースの中にツール(PL/SQL、REST、他の MCP サーバー)を定義し、エージェントが自律的に呼ぶ枝組みです。Oracle はこれを Private Agent Factory と組み合わせ、複数のエージェントが DB を介して連携する構成を出しています。Claude 側でも同じ方向で、Claude Code のサブエージェントや Claude Agent SDK から MCP を呼ばせる形が整っています。人が画面で聞く使い方は残りますが、日次の集計や監視の確認は、エージェントが定刻にレポートを呼んで Slack に流す形に寄っていきます。
| 1 段目(この講座) | 2 段目 ORDS MCP | 3 段目 OCI マネージド MCP | 4 段目 Autonomous 内蔵 MCP |
|---|---|---|---|
-home の保存接続 | ORDS の接続プール + ID 基盤の JWT | OCI Database Tools Connections + OCI IAM の OAuth 2.0 | Oracle Database Identity |
sql -mcp(stdio) | https://ords.example.co.jp/mcp(streamable HTTP) | OCI が提供する MCP エンドポイント | データベースの MCP エンドポイント |
run-sql で自由な SQL | run-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 年夏に出たばかりで、日本との時差は小さいです。
conn -save を配るのが運用として回らなくなったとき。Entra ID か Keycloak があれば、ORDS 26.2 をスタンドアロンで立てるだけで上がれます。オンプレミスの 19c にそのまま向けられます。この節の時系列は Oracle と Anthropic の公式発表・リリースノートの日付です。各段の対応表は 2026 年 9 月時点の製品仕様で、ORDS と OCI マネージド MCP のツール名・役割名は今後の版で増えることがあるので、移行を検討する時点の公式ドキュメントで確かめてください。
11 / Read the symptom
環境を組んだ直後に持ち込まれる症状 3 例です。いずれも理解のための架空の状況です。 症状と最初に見る場所から、原因を当ててみましょう。
12 / Myth vs. reality
どれも一見もっともらしく、経験のある DBA ほど言いがちな判断です。
つながっているのは SQLcl で、Claude は SQL 文を渡して結果のテキストを受け取るだけです。だから権限は Oracle ユーザーで効き、パスワードは Claude に渡らず、記録は Oracle 側に残ります。06 問い合わせの流れと痕跡の 4 段の図で、Claude が触れているのがツール名と引数の JSON だけであることを確かめてください。
結果は Claude との会話に入ります。見せる表と列を決めるのは「書けるか」ではなく「Claude に渡ってよいか」で判断します。加えて読み取りでも重い集計は動くので、Resource Manager の上限が要ります。02 準備の対象データの表と、09 ガバナンスと運用の MAX_EST_EXEC_TIME がこの 2 点に対応しています。
上の段で変わるのは、資格情報の置き場所と認可の主体、そして AI に渡すものが自由な SQL か承認済みのツールかの 2 点です。専用ユーザー・ビュー・統合監査・Resource Manager・SQL Firewall はそのまま残り、SQL Firewall の許可リストは上の段のレポートの候補になります。10 米国での使われ方と次の段階の対応表の最後の行がそれです。1 段目で DB 側を丁寧に組むほど、上の段への移行は軽くなります。
13 / Knowledge check
答えを当てるだけでなく、なぜそう判断できるのかを説明できれば合格です。
選択肢を1つ選んでください。
Take it home
-home と -R を明示Claude と Oracle Database をつなぐ作業は、SQLcl の設定を数行書けば終わります。時間をかけるべきなのはその前と後です。前は「どの表を Claude との会話に含めてよいか」を決めて専用ユーザーの権限に落とすこと、後は「誰が・どのモデルで・何を実行したか」を Oracle 側の記録で追える形にし、重い集計と想定外の SQL を DB の中で止めることです。
この DB 側の設計は、接続経路が SQLcl から ORDS や OCI に変わっても残ります。利用者が増えて PC ごとの接続配布が回らなくなったとき、ORDS 26.2 と自社の ID 基盤で 2 段目に上がる。定型の問い合わせを許可リストに固定しておいたなら、その中身が上の段のレポートになる。1 段目を丁寧に組むことが、そのまま次の段への準備になります。
参考資料
目次