0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JevでSQLの危険度を判定するCLIを試した:直接実行前のチェックに使える範囲と使えない範囲

0
Posted at

はじめに

運用環境でSQLを直接実行する場面では、DELETE や DROP TABLE だけでなく、条件付きの大量更新や権限変更にも注意が必要です。

jev-sql-danger-checker は、SQLを実行せず、JevへSQL本文を送って意味的な運用リスクを分類する実験的なCLIです。

結論から言うと、このツールを実行許可・拒否の仕組みには使えません。一方で、直接実行前に人間のレビューを促す補助線としては使いどころがあります。

Jevが返すのは文章ではなく型付きの判断

Jevは、TypeSafe AIが「System One Model」と呼んでいるAIモデルです。同社は、入力した状態と質問に対して、文章ではなくコードで扱える型付きの判断を返すモデルだと説明しています。TypeSafe AIのJev紹介

確率値や判断の校正に関する説明もTypeSafe AIによるものです。この記事で確認できるのは、このCLIがJevへSQLと質問を送り、決められた形式の値を受け取る実装になっていることです。

型 このCLIでの用途 返す値
noul 広範囲影響、破壊性、レビュー要否 質問に対する0から1の確率値
choice 危険度の分類 SAFE、CAUTION、DANGEROUS、CRITICAL のいずれか

構造化された値であっても、SQLの構文妥当性や実行計画、実データに基づく影響を保証するものではありません。

判定しているのは実行計画ではない

CLIはSQL文字列をJevへ渡し、次の4項目を別々に返します。

判定項目 見ていること
意味的な広範囲影響リスク(CLI表示は Semantic full scan risk) SQL文面から、多数または全行に影響しそうか
Destructive risk データの破壊や復旧困難な変更につながりそうか
Production review required 本番実行前に人間のレビューが必要そうか
Danger level 4段階の総合ラベル

Semantic full scan risk は物理的なフルスキャンを判定するものではありません。質問文も、全行を scan or affect する可能性を尋ねています。実行計画上のフルスキャンではなく、SQL文面から見た広い影響範囲のシグナルとして扱います。

semanticFullScanRisk: noul(
  "Could this SQL potentially scan or affect most or all rows of a table?",
)

実測では、総合ラベルだけで実行可否を決められなかった

リポジトリには、条件のない DELETE の観測値と、Node.js v22.17.0 で代表的なSQLを標準入力から各1回実行した比較結果が記録されています。次は比較しやすい5件です。すべて単一回の観測値であり、モデルや質問文の変更によって変わり得ます。

SQLの種類 広範囲影響 破壊的 レビュー要否 Danger level
主キーによる1件取得 23% 1% 24% SAFE
LIMIT 付き一覧取得 75% 1% 31% SAFE
主キーで絞った UPDATE 10% 62% 71% SAFE
条件のない DELETE 98% 98% 98% CRITICAL
広い条件での権限変更 85% 87% 97% CRITICAL

LIMIT 付き一覧取得は総合ラベルが SAFE でも、広範囲影響リスクは75%でした。主キーで絞った UPDATE も SAFE ですが、破壊的リスク62%、レビュー要否71%です。

この結果からも、Danger level だけを実行可否に使うのは危険です。全10件の入力と実測値は、実行結果と評価用SQL例に記録しています。

直接実行の前に使うなら、判定結果を止める理由にする

自分がこのツールを使うなら、DBコンソールや踏み台からSQLを直接実行する前の確認に置きます。

SAFE を実行許可と読み替えません。判定結果は「SQLを流してよい」という答えではなく、「次に何を確認すべきか」を決めるために使います。

SQL本文を外部へ送ってよいか確認する

このツールは判定対象のSQL本文を外部APIへ送ります。顧客IDなどの個人情報、認証情報、非公開のテーブル名や業務ルールを含む本番SQLは入力しません。

DBに接続しないことは、入力内容を外部へ送ってよいことを意味しません。送信が許可された環境に限定し、必要ならリテラルをダミー値に置き換えます。

実行計画の代わりにはならない

アクセスパスは、DBMSとバージョン、インデックス、統計情報、結合順序、パラメータ、オプティマイザに依存します。性能やロックの影響を確認するなら、対象環境に近い条件で EXPLAIN や EXPLAIN ANALYZE を実行します。

まとめ

  • 広範囲に影響しそうか、破壊的か、レビューが必要かを分けて見られる
  • SAFE を実行許可と扱わず、注意を促す補助線として使う
  • SQL本文を外部APIへ送ってよいかを最初に確認する
  • 構文、実行計画、ロック、対象件数、復旧手順は別途確認する

AIによる危険度判定はSQLレビューやDBMSの機能を置き換えません。しかし、急いでいるときほど飛ばされやすい「一度止まって確認する」工程を作るには使えます。

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?