SQL Serverのエラーコード一覧|意味・確認SQL・4104の対処

SQL Serverのエラーは、番号だけでなく全文・State・Severity・発生したSQLを合わせて確認します。下の表は主な番号の早見表です。すべてのエラーを網羅するものではなく、使用中のSQL Serverでの正式なメッセージはsys.messagesから確認できます。

目次

SQL Serverの主なエラーコード一覧

番号意味の要約最初の確認
18456ログイン失敗認証方式・接続先・SQL ServerエラーログのStateを確認
4060要求されたデータベースを開けずログイン失敗DB名・オンライン状態・ログインとDBユーザーの対応を確認
229/230オブジェクト/列の操作権限が拒否拒否された操作・スキーマ・列を確認して必要な権限だけ管理者へ相談
102構文が不正エラー行付近のSQLを確認
207/208列名/オブジェクト名が無効接続DB・スキーマ・実際の名前を確認
4104複数部からなる識別子を関連付けられないFROMにある別名と列参照の接頭辞を確認
515NOT NULL列へNULLを挿入入力値と列の仕様を確認
517列への値の追加でオーバーフロー対象列の型と演算結果の範囲を確認
547制約と操作が競合メッセージの制約名と入力・参照先データを確認
2627一意制約などの重複キー競合した制約・キー値を確認
8152/2628文字列・バイナリの長さを超えて切り詰めが必要入力長と列定義を確認。2628では対象列などが示される
1205デッドロックの犠牲トランザクション競合の順序・処理範囲を調べ、必要な再試行を設計
1222ロック取得待ち時間を超過ブロックしている処理とロック保持時間を確認
3930現在のトランザクションをコミットできない先行エラーを確認し、現在のトランザクションをロールバック
9001データベースのログが使用できない直前のI/Oなどの関連エラーを確認
9002トランザクションログが満杯ログ再利用待ちの理由、空き容量とバックアップを調査

定義の根拠はMicrosoftの公式一覧です:0〜999、2000〜2999、3000〜3999、4000〜4999、8000〜8999。同じ番号でもメッセージ中のオブジェクト名や制約名が違うため、表の要約だけで設定変更を決めないでください。

sys.messagesから正式な意味を確認するSQL

sys.messagesは番号・言語ごとにメッセージを持つカタログビューで、message_id、language_id、severity、textを参照できます。以下は英語メッセージを読む例です。データや設定を変更しません。

SELECT message_id, language_id, severity, [text]
FROM sys.messages
WHERE language_id = 1033
  AND message_id IN (517, 547, 4104, 9001, 9002)
ORDER BY message_id;

実際に出た番号にINの値を置き換えます。日本語など別の言語で読む場合は、その環境の言語IDを確認してください。sys.messagesを読むにはpublicロールへの所属が必要とされており、この確認のために広い管理者権限を付与する必要はありません。

Msg 4104:テーブル名と別名の混在を確認する

4104の公式説明では、列の接頭辞がFROM句にあるテーブル/別名と結び付かない場合などを挙げています。別名を付けたテーブルを元のテーブル名で参照していないかを確認します。以下は既存テーブルを作成・更新せずに違いを見る例です。

-- 別名 s を付けた後で Sample を参照するため4104になる例
WITH Sample(ItemID) AS (SELECT 1)
SELECT Sample.ItemID FROM Sample AS s;
-- 列の接頭辞を別名 s に合わせた例
WITH Sample(ItemID) AS (SELECT 1)
SELECT s.ItemID FROM Sample AS s;

JOIN先のテーブルがFROMにない場合も、列名だけ直して解決するとは限りません。メッセージに表示された識別子を探し、クエリ内の別名・JOIN・参照範囲を確認します。

9001と9002を区別する

エラー9001はログが使用できない状態で、ログが満杯であることを示す9002とは区別します。 9001の公式説明は、この状態に至った原因を周辺のエラーから調べるよう案内しています。ログファイルへのアクセス、ストレージなどの問題を、該当時刻のログと合わせて管理者が調べます。

9002の公式説明では、sys.databasesのlog_reuse_wait_descがログ領域を再利用できない理由を示すとされています。ログバックアップの停止、ディスクやファイル上限、同期処理などを確認し、理由に合う対処を選びます。ログファイルを直接削除して空きを作る操作はしません。

18456・1205・1222の対処を選ぶ

18456はパスワードの誤りだけが原因ではありません。SQL認証/Windows認証、接続先、ログイン状態、サーバーログにあるStateを確認します。すべてのログイン失敗でパスワード変更やsysadmin付与を行うことは避けます。

1205ではSQL Serverがデッドロックの犠牲トランザクションを選び、その処理をロールバックします。1222はロックを待つ時間を超えたエラーです。両者を同じタイムアウトとして扱わず、競合するSQLと処理時間を調べます。再試行は、処理の重複や外部への副作用も考えてアプリケーション側で設計してください。

517・547・3930で誤った対処をしない

  • 517:列への値の追加で生じたオーバーフローです。「復元ログが不完全」と一律に判断してデータベースの復元を始めるエラーではありません。
  • 547:表示された制約と操作が競合しています。外部キーに限るとは決めつけず、制約名・定義・入力値を確認します。制約を削除する前に、必要なデータの整合性を確認してください。
  • 3930:現在のトランザクションがコミットできず、ログへ書く操作もできない状態です。先行したエラーを調べ、ロールバックしてから再実行の条件を整えます。「すでに全体がロールバック済み」とは判断しません。

調査・問い合わせ時に残す情報

  • エラー番号・全文・State・Severity・発生日時
  • SQL Serverの版と接続先データベース、実行したSQL
  • 直前のエラー、実行ユーザー、トランザクションの範囲
  • 繰り返し発生するか、特定データや処理だけで起きるか

本番での復元・権限変更・制約変更は、この早見表だけで実行せず、管理者が該当エラーの公式資料と環境を照合します。まず正式なメッセージと直前の状態を読むことが、誤った対処を避ける近道です。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次