【実務・中級編】 pg_namespace – PostgreSQL

「スキーマって結局なんなの?」を解決する:`pg_namespace`という深淵

やあ。PostgreSQLを触り始めて少し経ったかな?
SQLを叩いてテーブルを作ったり、データをSELECTしたりするのには慣れてきた頃だと思う。でも、ふと「スキーマ」という存在について考えたことはある?

「まあ、`public`ってやつでしょ?」とか「名前空間を分けるためのフォルダみたいなもんじゃないの?」と思っているなら、それは半分正解で、半分は「データベースの深淵」を見逃しているよ。

今日は、PostgreSQLの心臓部にあるシステムカタログの一つ、`pg_namespace`について話をしよう。これを知ると、DBのメタデータに対する解像度がグッと上がるはずだ。

—

pg_namespaceって何者?

簡単に言えば、「データベース内のスキーマを管理する名簿」だ。

PostgreSQLでは、テーブルや関数、型といったオブジェクトは、必ずどこかの「名前空間(Namespace)」に属している。SQLで`SELECT FROM public.users`と書くとき、`public`が指し示している実体こそが、`pg_namespace`に記録されているデータなんだ。

試しに、自分の環境でこれを叩いてみてほしい。

SELECT nspname, nspowner, nspacl
FROM pg_namespace;

どうだい? `public`や`pg_catalog`、`information_schema`といったおなじみの名前が並んでいるはずだ。これが、PostgreSQLという広大な宇宙を整理整頓するための「住所録」というわけさ。

—

なぜ実務でこれを意識する必要があるのか?

「いやいや、`CREATE SCHEMA`とか`SET search_path`で十分でしょ?」と思うよね。確かに開発レベルならそれでいい。

だけど、運用や設計の現場では、こんな場面に出くわすことがある。

  • 「特定のスキーマに、誰がどの権限を持っているか棚卸ししたい」
  • 「マイグレーションツールや自動生成スクリプトを作るとき、安全なスキーマ一覧を取得したい」
  • 「一時テーブル(TEMPテーブル)がどこに隠れているか確認したい」

特に、複雑な権限管理が必要なシステムや、マルチテナント構成でスキーマを動的に扱うような設計をしていると、`pg_namespace`と`pg_class`(テーブル情報を管理するカタログ)をJOINして遊ぶことが増えてくるんだ。

—

実践:スキーマの「持ち主」と「権限」を覗き見る

例えば、「どのスキーマに誰がアクセスできるか」を一覧で見たいとき、現場のエンジニアはこんなクエリをサッと書く。

SELECT
n.nspname AS schema_name,
r.rolname AS owner_name,
n.nspacl AS access_privileges
FROM pg_namespace n
JOIN pg_roles r ON n.nspowner = r.oid
WHERE n.nspname NOT LIKE ‘pg_%’; — システムスキーマを除外

ここで注目してほしいのが `nspacl` カラムだ。ここにはスキーマに対するアクセス権限が配列形式で格納されている。これを知っていると、DBのセキュリティ監査や、権限設定のミスを未然に防ぐためのチェックツールを自作できたりする。

—

ちょっとした「深掘り」のヒント:一時スキーマの謎

PostgreSQLで一時テーブル(`CREATE TEMP TABLE …`)を作ったとき、あれは一体どこに消えていると思う?

実は、接続ごとにバックグラウンドで動的に作成される`pg_temp_…`という名前のスキーマがあるんだ。これもちゃんと`pg_namespace`に記録されている。

— 接続中のセッションで一時テーブルを作った後に叩いてみて
SELECT nspname FROM pg_namespace WHERE nspname LIKE ‘pg_temp_%’;

これを確認できると、「一時テーブルが予期せぬ場所で競合していないか?」といったトラブルシューティングができるようになる。DBが「今、裏側で何をしているか」をカタログ越しに覗き見る感覚、これがエンジニアとしての醍醐味だよ。

—

最後に:カタログと仲良くなろう

正直なところ、`pg_namespace`を直接更新(UPDATE/DELETE)することはまずない。そんなことをしたらDBが壊れるからね。

でも、このカタログを「読む」能力は、PostgreSQL使いとしての武器になる。「PostgreSQLはブラックボックスだ」と感じる瞬間があったら、まずは`pg_`から始まるテーブルを覗いてみてほしい。そこには、PostgreSQLがどうやって君たちの命令を解釈し、整理しているのかという「設計思想」が詰まっているから。

今回の話が、君のDB操作におけるちょっとしたヒントになれば嬉しい。また何か困ったことがあったら聞いてくれよ。現場からは以上だ!

コメント

タイトルとURLをコピーしました