ホーム › フォーラム › A5:SQL Mk-2掲示板 › PostgreSQL で一部テーブルが一覧に含まれない
- このトピックには4件の返信、1人の参加者があり、最後にntzにより6ヶ月前に更新されました。
-
投稿者投稿
-
ntzゲスト
いつも便利に使わせていただいております。
タイトルの件で、質問させていただきます。現在 v2.19.1 及び v2.20.0 beta8 をそれぞれポータブル版で使用していますが、PostgreSQL で一部のテーブルが一覧に含まれていないようです。
具体的には下記操作で public スキーマ内のテーブルを一覧すると 725件ありますが、ツリービューでは「public > テーブル (720)」と表示されており、実際にいくつかのテーブルが見当たりません。
SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = ‘public’;
しかし見えないテーブルに対して何らかの SQL を実行すると、正しく操作可能です。
これは既知の現象でしょうか?
追加情報等が必要であれば、お知らせください。よろしくお願い致します。
松原正和キーマスターntz さんこんにちは。
お返事が遅くなり申し訳ありません。PostgreSQL でテーブルを列挙するとき、pg_class の relkind 列の値で制限をかけたものを取得しています。
A5:SQL Mk-2 内部では次のようにしてテーブル一覧を列挙しています。
select
ns.nspname as TABLE_SCHEMA
, t.relname as TABLE_NAME
, t.relkind as TABLE_TYPE
from
pg_catalog.pg_class t
inner join pg_catalog.pg_namespace ns
on ns.oid = t.relnamespace
where
ns.nspname = ‘public’
and t.relkind in (‘r’, ‘v’, ‘m’, ‘f’, ‘p’)
ORDER BY
ns.nspname
, t.relname
これで、先の pg_tables の結果セットと比較してどのようなテーブルが列挙されないか確認していただけないでしょうか?
よろしくお願いいたします。
ntzゲストご返信ありがとうございます。いただいた SQL での検証結果をお送りします。
左から 3列が頂いた SQL の結果で、pg_tables 列が先にお送りした pg_tables の結果、a5 列が A5:SQL Mk-2 のテーブルツリービューの結果で、値を “-” としている箇所が結果に含まれない(=見えない)テーブルです。
+————–+——————————–+————+———————–+—-+
| table_schema | table_name | table_type | pg_tables | a5 |
+————–+——————————–+————+———————–+—-+
| public | ci_builds | r | ci_builds | – |
| public | ci_builds_metadata | r | ci_builds_metadata | – |
| public | ci_job_artifacts | r | ci_job_artifacts | – |
| public | ci_pipeline_variables | r | ci_pipeline_variables | – |
| public | ci_stages | r | ci_stages | – |
| public | postgres_autovacuum_activity | v | – | – |
| public | postgres_constraints | v | – | – |
| public | postgres_foreign_keys | v | – | – |
| public | postgres_index_bloat_estimates | v | – | – |
| public | postgres_indexes | v | – | – |
| public | postgres_partitioned_tables | v | – | – |
| public | postgres_partitions | v | – | – |
| public | postgres_sequences | v | – | – |
+————–+——————————–+————+———————–+—-+
ただ今回の事象が発生している DB には table_type が “r” のテーブルが 696個ありますが、アプリケーション上で見えないのは a5 列の 5テーブルのみです。
そこで正常に表示される 720 テーブルと表示されない 5 テーブルの違いを pg_class で探してみたところ、pg_class.relispartition が true のテーブルが表示されていないようです。
解決の手がかりになりますでしょうか?
松原正和キーマスターntz さんこんにちは。
pg_class.relispartition が true というのは、パーティションテーブルの子テーブルですね。
少し前のバージョンから、パーティション子テーブルは列挙せず、親テーブルを開いたときに必要に応じてプルダウンから子テーブルを選択することでその子テーブルのみ表示できるようにしています。
ちょっとわかりにくかったですかね。ちょっとUIというか見せ方を考えた方がよいかもしれませんね。ntzゲストご返信ありがとうございます。
そう言うことだったんですね。パーティションテーブルに関して知識がなく、以前は表示されていたテーブルが見えなくなったことで混乱しておりました。失礼致しました。
パーティションテーブルの親子関係には命名規則上のルールはなく、SQL を実行して調べるしかないようですので、親テーブルに紐づく子テーブルで目視できるような UI 上の機能があれば、さらに利便性が上がるかもしれないと感じました。
ご対応いただき、ありがとうございました。
-
投稿者投稿