PostgreSQLの「public」スキーマとは

PostgreSQLでは、データベースを作成すると自動的に「public」スキーマが生成されます。
スキーマはデータベース内のオブジェクト(テーブル、ビュー、関数など)を論理的に分類する名前空間の役割を果たします。
「public」スキーマは、特に明示的にスキーマ名を指定しなかった場合のデフォルトの格納先となります。

  • 自動生成とデフォルト設定
    データベース作成時に自動的に作成され、スキーマ名を省略した場合、テーブルやその他のオブジェクトは「public」内に配置されます。
    citeturn0search2
  • 権限の初期状態
    従来は全ユーザーに対してCREATEやUSAGE権限が付与され、誰でもオブジェクト作成が可能でした。しかし、PostgreSQL 15以降では、データベースオーナーのみが「public」スキーマに対してオブジェクト作成できるように制限されています。
    citeturn0search1
  • 名前空間としての役割
    複数のスキーマを利用することで、同一データベース内に同名のオブジェクトを重複なく管理でき、用途やセキュリティに応じた細かな権限設定が可能となります。

具体的な利用事例

1. 開発・テスト環境での迅速なプロトタイピング

  • 概要:
    初期開発段階や実験的な検証環境では、余計なスキーマ設計を行わず、デフォルトの「public」スキーマ内でテーブルやビューを作成することで、すぐに機能検証が可能です。
  • 利用例:
    • 新規プロジェクトの試作段階で、以下のようなSQLを実行してテーブルを作成 CREATE TABLE public.sample ( id serial PRIMARY KEY, data text );
    • 開発・テスト環境での一時的なデータ格納先として活用
      citeturn0search0

2. 小規模アプリケーションでのシンプルな管理

  • 概要:
    利用者やデータ量が限定されるシステムでは、専用のスキーマを設計せず「public」スキーマ内に全オブジェクトをまとめることで、運用が容易になります。
  • 利用例:
    • 社内向けの簡易なツールやWebアプリケーションにおいて、開発・運用コストの低減を図る
    • オブジェクトの追加や変更が少なく、管理がシンプルなケースで活用

3. 共有データ・マスター情報の配置

  • 概要:
    全ユーザーが参照する共通のマスターデータ(例:国コード、業種情報、共通設定情報など)を配置する際、初期設定の「public」スキーマを利用することで、アクセスが容易になります。
  • 利用例:
    • マスターテーブルの作成例 CREATE TABLE public.countries ( country_code char(2) PRIMARY KEY, country_name text );
    • すべてのユーザーが参照可能なデータとして運用

4. レガシーシステムとの互換性確保

  • 概要:
    既存のシステムやアプリケーションが「public」スキーマに依存している場合、互換性を維持するために、当初はそのまま「public」スキーマを利用するケースがあります。
  • 利用例:
    • 旧システムのSQLクエリやアプリケーションロジックが「public」スキーマを前提としている場合、急なスキーマ移行を避けるためにそのまま運用

5. セキュリティ向上策としての設定変更

  • 概要:
    PostgreSQL 15以降は、デフォルトでデータベースオーナー以外による「public」スキーマへのオブジェクト作成が制限されています。これにより、不要な権限付与によるセキュリティリスクを軽減できます。
  • 利用例:
    • 新規データベース作成時に、以下のような設定変更を行い、他ユーザーの不正なオブジェクト作成を防止 REVOKE CREATE ON SCHEMA public FROM PUBLIC;
    • 運用環境で、システム全体のセキュリティポリシーに沿った権限管理を実現

まとめ

PostgreSQLの「public」スキーマは、デフォルトで自動生成される便利な名前空間として、開発や小規模システム、共通データの管理、さらにはレガシーシステムとの互換性維持に役立ちます。
一方、最新バージョンではセキュリティ向上のために権限が制限されるなど、運用環境に合わせた適切な設定変更が必要です。
用途に応じて、デフォルトの「public」スキーマをそのまま利用するか、あるいは専用スキーマを設計してオブジェクトの分離・権限管理を行うかを判断し、効率的かつ安全なシステム運用を実現してください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です