表を作ったユーザーでは動く 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のフル記事にまとめています。
この記事のような現場のTIPSを、Db2運用の全体像として12章に体系化しました。公式マニュアルには載らない「あのとき知っていれば」を減らすための1冊です。
現場で引ける Db2 の教科書
現場で引ける!Db2実践エンジニア・バイブル
Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ―― そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。
アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集。