テクノロジー · 実用ガイド

PostgreSQLで relation does not exist?search_path変更前に失敗セッションを特定

SQLSTATE 42P01 は、アプリと管理シェルが別DB・schema・sessionで名前を解決していることがあります。失敗接続で読み取り専用プローブを実行し、証明した分岐だけを直します。

PostgreSQLで relation does not exist?search_path変更前に失敗セッションを特定
オリジナルイラスト:同じpool、transaction、roleで database、server address/port、user、role、search_path、current_schemas(true)を記録します。 Watch at Ease

pgAdmin や psql で表が見えても、アプリは relation does not exist を返せます。失敗したセッションのサーバー、DB、role、search path、識別子を確認します。

表の再作成や全体 search_path 変更、広い権限付与から始めません。元の接続でエラーと SQLSTATE を保存し、読み取り専用フィンガープリントを取ります。

失敗セッションを正確に採取

同じpool、transaction、roleで database、server address/port、user、role、search_path、current_schemas(true)を記録します。

relation token、引用、schema、SQLSTATEをそのまま保存し、管理シェルでも同じ指紋を取得します。

状態を変えず名前を解決

未修飾名とschema修飾名をto_regclassで調べ、pg_classとpg_namespaceでrelkind、persistence、visibilityを確認します。

両方NULLなら、誤DB、未適用またはrollback migration、削除、別sessionのtemp表を調べます。

case・visibility・privilegeを分離

catalogの綴りとSQLを比較します。"Orders"は正確な引用が必要です。

修飾名が存在するのに失敗する場合、schema USAGE、table privilege、API公開設定を別々に確認します。

migration/admin sessionを比較

作成したmigration toolまたはtransactionで同じ指紋を取り、host、port、DB、role、schemaを比較します。

未commit CREATE、失敗migration、別tenant、temp表はsearch_path変更で直りません。

狭い修正を適用し再検証

一つの安定物体はschema修飾名を使います。未修飾が必要ならroleまたはconnection初期化を確認してpoolを再接続します。

renameとgrantは協調して最小限に行い、対象確認前に表を再作成しません。新しいapp接続で元の文を再実行します。

PostgreSQLで relation does not exist?search_path変更前に失敗セッションを特定
オリジナルイラスト:renameとgrantは協調して最小限に行い、対象確認前に表を再作成しません。新しいapp接続で元の文を再実行します。 Watch at Ease