[pgsql-jp: 41745] Re: 8.4.8 → 9.1.6 へのバージョンアップ後の oid 不整合について

Shigeru HANADA hanada @ metrosystems.co.jp
2014年 11月 11日 (火) 12:51:58 JST


花田です。

(2014/11/11 12:23), 園田 真樹 wrote:
> すると、ユーザーテーブルのコメントを取得する以下のクエリを実行すると
> 結果が0件となります。
> (pg_description を select すると、コメントは挿入されています)
> 
> SELECT
>    DESCRIPTION
> FROM
>    PG_ATTRIBUTE
> JOIN PG_CLASS ON ATTRELID=RELFILENODE
> JOIN PG_DESCRIPTION
> ON RELFILENODE=OBJOID AND ATTNUM=OBJSUBID;

このSQLの結合キーが間違っています。pg_attribute.attrelidや
pg_description.objoidと一致するのはpg_class.relfilenodeではなく、
pg_class.oidです。結合キーの対応関係は、「参照先」という項目で、マニュア
ルの「システムカタログ」セクションに載っています。
http://www.postgresql.jp/document/9.1/html/catalog-pg-attribute.html

relfilenodeはそのリレーションのファイル名に使われる数字で、TRUNCATEや
CLUSTERなどのコマンドで変化します。テーブル作成直後はoidと同じ値なので、
上記のSQLはそれらの操作をするまではたまたま動いていた、ということだと思
います。

> 調査すると、pg_class、pg_description、pg_attribute で
> 作成したユーザーテーブルの oid に整合がとれていないことが分かりました。

おそらくTRUNCATEやCLUSTERなどをしたテーブル群だと思います。

-- 
株式会社メトロシステムズ
インテグレーション事業部
花田茂
TEL: 03-5951-1219(部門直通)


pgsql-jp メーリングリストの案内