AI エージェントに本番 DB の migration を任せる(破壊的 SQL を構造的に実行できないランナー)
本番 DDL だけ毎回人が SQL エディタに貼っている状態を解消する手順。禁止語 grep ではなく allowlist 文法でパースして許可構文だけ実行するランナーを1本作り、そのパスだけを許可する。成功判定に「期待カラムの実在確認」を必須化して沈黙 failure を潰す。TLS のプライベート CA、マネージド DB 標準の event trigger、履歴基準の「未適用」誤読という3つの落とし穴の回避込み。
約3.6万トークンの節約 (API料金換算で約54円分)。 要件定義・技術調査・試行錯誤ぶんのトークンがまるごと不要になります。※ 出品者申告とレビューに基づく推定値。モデル・タスク内容により変動します。
この巻物について
「AI エージェントに本番 DB の migration を任せる(破壊的 SQL を構造的に実行できないランナー)」は、開発プロセスカテゴリのAI指示書(MDファイル)です。本番 DDL だけ毎回人が SQL エディタに貼っている状態を解消する手順。禁止語 grep ではなく allowlist 文法でパースして許可構文だけ実行するランナーを1本作り、そのパスだけを許可する。成功判定に「期待カラムの実在確認」を必須化して沈黙 failure を潰す。TLS のプライベート CA、マネージド DB 標準の event trigger、履歴基準の「未適用」誤読という3つの落とし穴の回避込み。この巻物をAIに読み込ませると、ゼロから設計・調査する場合に比べて 約3.6万トークン(API料金換算で約54円)・86%のトークンを節約できます。
- カテゴリ
- 開発プロセス
- 対応AI
- claude-code、cursor、codex-cli
- ライセンス
- 商用利用可 (再販不可)
- 価格
- 無料
- ゼロから開発時
- 約4.2万トークン
- この巻物使用時
- 約6,000トークン
- 節約量
- 約3.6万トークン (約54円)
- 更新日
- 2026-10-08
使い方 (AIに渡す3つの方法)
いちばん簡単なのはワンライナー。Claude Code のターミナルに貼るだけです。
claude "https://makimono-md.vercel.app/api/v1/files/ai-db-migration-sql/raw を読み込んで、この指示書どおりに実装して"
中身
AI エージェントに本番 DB の migration を任せる(破壊的 SQL を構造的に実行できないランナー)
誰向け
AI コーディングエージェント(Claude Code / Codex 等)に開発を任せているが、 本番 DB への DDL だけは毎回人間が SQL エディタに貼っているチーム向け。 その1操作を安全に AI 側へ移すための設計と、実際に踏んだ落とし穴をまとめる。
前提と結論
- エージェントの安全機構(コマンド分類器)は「本番デプロイ」「本番 DB 書き込み」を既定で止める。 これは正しいので解除しようとしない。解除ではなく、許可する操作の範囲を狭める。
- 具体策: 「破壊的な SQL を構造的に実行できないランナー」を1本だけ作り、
そのスクリプトのパスだけを許可リストに入れる。
node scripts/*のような広い許可は作らない。 - エージェント自身に許可を追加させない(自己権限付与は分類器が止めるし、止めるべき)。 人が1回だけ許可を入れる。以後の migration 適用はエージェントが完結する。
ランナーの設計(ここが本体)
1. allowlist 文法(正規表現スキャンにしない)
禁止語を grep する実装は、文字列リテラルやコメント中の drop を誤検知し、
逆に ALTER ... DROP COLUMN のような複合構文を取りこぼす。
SQL を字句分割 → 文単位にパース → 許可した構文だけを再構築して実行する。
- 許可:
create table if not exists/alter table ... add column/create index/comment on/create policy/enable row level security - 拒否:
drop/truncate/delete/update/alter ... drop column/alter ... type/grant/revoke/ ロール操作 - 1文でも禁止構文があればバッチ全体を拒否(部分適用を作らない)
2. 実行の約束
- 単一トランザクション。失敗時は rollback
- 適用前後で対象テーブルの
information_schema.columnsを取り、差分を出力 - 対象テーブルの
count(*)が変化したら rollback(DDL なら行数は不変) - 実行記録を JSONL に追記。同じ SQL のハッシュが成功済みなら no-op(二重適用防止)
--list/--dry-runは読み取り専用。--applyのときだけ書き込む
3. 成功条件を厳しくする(これが最重要)
exit 0 と「適用成功」を実際の効果が確認できたときだけ出す。
add columnを含むのに適用後もカラムが存在しない → exit 1 で失敗- 元から存在していた(冪等 no-op)場合は「既に適用済み」と明確に区別して出す
これが無いと「成功と報告されたが何も起きていない」沈黙 failure を人が検出できない。 実際に、この検証を足すまで区別がつかず、調査が半日分往復した。
踏んだ落とし穴(そのまま再現する)
TLS: SELF_SIGNED_CERT_IN_CHAIN
マネージド DB の多くはベンダー独自のプライベート CA を使う(公開 CA ではない)。
検証を切る(rejectUnauthorized:false)のは本番 DDL ツールでは不可。
正しくは CA を明示する:
openssl s_client -starttls postgres -connect <db-host>:5432 -showcerts </dev/null \
| awk '/BEGIN CERT/{n++} n==<ルートの番号>' > root.pem
NODE_EXTRA_CA_CERTS=root.pem node scripts/apply-migration.mjs --list
ベンダーの公式配布 URL があればそちらを使う(古い記事の URL は 404 になっていることがある)。
event trigger ガードの過剰反応
「有効な event trigger がある DB では適用しない」は妥当な防御だが、 マネージド DB は標準で複数の event trigger を持つ(スキーマキャッシュのリロード、 拡張機能のアクセス制御など)。名前の allowlist にして、未知の名前だけを拒否し、 拒否時はその名前を表示する。名前を出さないと原因に辿り着けない。
「未適用」の判定根拠を確かめる
--list の「未適用」が履歴テーブル基準なのかオブジェクト実在基準なのかで意味が全く違う。
新規に置いたプローブ用ファイルは履歴に無いので必ず「未適用」と出る。
判定根拠を確認せずに「本番にカランが無い」と断定しない(筆者はこれで誤報を出した)。
許可の入れ方(人の操作は生涯1回)
- ランナーを作り、人に渡す前に自分でテストを走らせる(禁止構文を含む SQL を食わせて拒否されること)
- 許可はそのスクリプトのフルパス1本だけ
- 設定ファイルを人に手で編集させない。ワンクリックで実行できる形(デスクトップのランチャー等)で渡し、 スクリプト側が「これから許可する操作」を画面に出してから書き込む
- ランチャーは終了コードを必ず伝播させる。しないと失敗が
OKと表示され、双方が誤診する
検証チェックリスト(完了判定)
- 禁止構文入り SQL が exit 2 でバッチごと拒否される
- テストが全件 pass(Windows 等、実際に動かす OS で実行する。コンテナ内の緑は別環境の保証にならない)
-
--dry-runが実行計画(追加されるカラム名)を出す -
--apply後に「適用成功」または「既に適用済み」が実在確認付きで出る - 同じ migration の2回目が no-op になる
向いていないケース
- データ移行を伴う migration(
updateが必要なもの)はこのランナーの対象外。設計上通さない - 複数環境へ一括適用したい場合は、環境ごとに別の許可と確認を用意する(1本の許可で全環境を触らせない)
よくある質問
+「AI エージェントに本番 DB の migration を任せる(破壊的 SQL を構造的に実行できないランナー)」とは何ですか?
本番 DDL だけ毎回人が SQL エディタに貼っている状態を解消する手順。禁止語 grep ではなく allowlist 文法でパースして許可構文だけ実行するランナーを1本作り、そのパスだけを許可する。成功判定に「期待カラムの実在確認」を必須化して沈黙 failure を潰す。TLS のプライベート CA、マネージド DB 標準の event trigger、履歴基準の「未適用」誤読という3つの落とし穴の回避込み。
+どれくらいトークン(費用)を節約できますか?
ゼロから開発すると約4.2万トークンかかりますが、この巻物を使えば約6,000トークンで済みます。差し引き約3.6万トークン(API料金換算で約54円)・86%の節約です。
+どうやって使いますか?
無料です。MDファイルを Claude Code などのAIに読み込ませるだけ。ワンライナーをターミナルに貼れば実装が始まります。要件定義や技術調査を省いて実装だけにトークンを使えます。
+どのAIツールに対応していますか?
claude-code、cursor、codex-cli に対応しています。
+商用利用できますか?
ライセンスは「商用利用可 (再販不可)」です。
🤝 自分でAIを動かすのは、まだ不安…という方へ
この巻物の内容を、AIを使うプロに丸ごと任せることもできます。姉妹サービスAI代行堂なら「LINEで頼むだけで、仕事が完成」。
関連する巻物
スマホ(Remote Control)から即相談できる Claude Code タブを VS Code に毎朝自動で用意する
自作VS Code拡張で公式Claude Codeのコマンド(editor.openLast/newConversation/renameSessionTab)を叩き、名前付きタブをN本自動補充。夜間はWM_CLOSE→再起動で毎朝揃える。--bg/ターミナル経路・タブ0でのnewConversation・SendKeys再読み込みが失敗する実測付き
夜間ジョブ異常を通知で終わらせず自動修復→AI修理PR→人へ引き渡す閉ループ
監視の『検知して通知』の後段に、決定的Playbook→AIコーダーの隔離worktree修理PR→持ち越し→人への3要素引き渡し、を足す実装指示書。argvで指示を渡すな等の実測の落とし穴つき
ドキュメント駆動開発プロセス CLAUDE.md — 作るものを固めてから書かせる
「AIが暴走して意図と違うものを作る」を根絶する開発プロセス指示書。UI仕様→機能設計→実装の順をAIに強制し、1ファイルごとに承認ゲートを挟む。受託開発・チーム開発向け。
この巻物、誰かのトークンも救えます
𝕏 で節約レシートをシェア