DB2 4 min read

Db2で表があるのに見つからない ― スキーマ名を省略したときの逆引き

表を作ったユーザーでは動く SQL が、アプリケーションのユーザーで実行すると落ちることがあります。

SQL0204N  "APPUSER.EMPLOYEE" is an undefined name.  SQLSTATE=42704

表が消えたわけではありません。

まず見る(結論)

メッセージの引用符の中が、Db2 が実際に探した スキーマ名.表名 です。これをカタログの実際のスキーマと比べます。

# 表が本当はどのスキーマにあるか
db2 "SELECT TABSCHEMA, TABNAME, TYPE FROM SYSCAT.TABLES WHERE TABNAME = 'EMPLOYEE'"

# 今の接続が既定でどのスキーマを探すか
db2 "VALUES (CURRENT USER, CURRENT SCHEMA)"

CURRENT SCHEMA の初期値は接続ユーザーの認可 ID です。カタログの TABSCHEMA と違えば、それが原因です。

症状 → 原因 → 対処(逆引き)

症状 よくある原因 まず打つ手
引用符の中が 自分のユーザー名.表名 スキーマ名を省略した DB2INST1.EMPLOYEE のようにスキーマ名を付ける。または SET SCHEMA
GRANT SELECT したのにまだ SQL0204N 権限の問題ではない。スキーマ名の省略が残っている スキーマ名を付ける。権限が無いときは SQL0551N になる
カタログを TABNAME='EMP_MIXED' で引いても0件 表が "Emp_Mixed" と引用符付きで作られている UPPER(TABNAME) で引き直し、SQL では "Emp_Mixed" と書く
SQL に書いていない名前がメッセージに出る 別名の参照先が無い SYSCAT.TABLES の TYPE='A' の行で BASE_TABNAME を見る
一時表を宣言した直後に SQL0204N SESSION. を付けていない SESSION.TMP1 のように書く
全ユーザーでスキーマ名を省略したい — CREATE PUBLIC ALIAS EMPLOYEE FOR TABLE DB2INST1.EMPLOYEE

手続きや関数が見つからない場合は SQL0204N ではなく SQL0440N、列名の誤りは SQL0206N です。

それでも切り分けられないとき(実機ログつきの詳解)

権限の有無で SQL0204N と SQL0551N が分かれる様子、別名を自分で作ろうとして SQL0552N になる例、一時表・引用符付きの表の実測ログは、Zennのフル記事にまとめています。

▶ Zennで続きを読む(無料)

Db2のSQL0204N ― 表はあるのに「未定義の名前」になる原因とメッセージの読み方


実機ログつきの詳解を読む →

この記事のような現場のTIPSを、Db2運用の全体像として12章に体系化しました。公式マニュアルには載らない「あのとき知っていれば」を減らすための1冊です。

現場で引ける Db2 の教科書

現場で引ける!Db2実践エンジニア・バイブル

Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ―― そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。

アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集。

Zennで読む →