スキーマ
データベースには、1 つ以上の名前付きスキーマが含まれています。データベース内の各スキーマには、テーブルや、その他の種類の名前付きオブジェクトが含まれています。デフォルトでは、データベースに、PUBLIC という名前の 1 つのスキーマが含まれています。スキーマを使用すると、共通の名前でデータベースオブジェクトをグループ化できます。スキーマは、ファイルシステムディレクトリに似ていますが、ネストできない点が異なります。
同じデータベース内の異なるスキーマ内で同一のデータベースオブジェクト名を使用でき、競合は生じません。例えば、MY_SCHEMA と YOUR_SCHEMA の両方に、MYTABLE という名前のテーブルを含めることができます。必要なアクセス許可が付与されたユーザーであれば、データベース内の複数のスキーマにわたりオブジェクトにアクセスできます。
デフォルトでは、オブジェクトは、データベースの検索パスに含まれる最初のスキーマ内に作成されます。詳細については、このセクションで後述する「検索パス」を参照してください。
スキーマは、組織において、またマルチユーザー環境での並行処理問題において以下のように有用です。
-
多数のデベロッパーが相互に妨害せずに同じデータベース内で作業できる。
-
データベースオブジェクトの論理グループを編成して、より管理しやすくする。
-
アプリケーションで使用されるオブジェクトを専用のスキーマに入れる機能をアプリケーションに追加する。これにより、それらのオブジェクトの名前と、別のアプリケーションで使用されるオブジェクトの名前とが競合しなくなる。
スキーマの作成、変更、および削除
あらゆるユーザーがスキーマを作成でき、所有するスキーマを変更または削除できます。
以下のアクションを実行できます。
-
スキーマを作成するには、CREATE SCHEMA コマンドを使用します。
-
スキーマの所有者を変更するには、ALTER SCHEMA コマンドを使用します。
-
スキーマおよびそのオブジェクトを削除するには、DROP SCHEMA コマンドを使用します。
-
スキーマ内にテーブルを作成するには、schema_name.table_name という形式でテーブルを作成します。
すべてのスキーマのリストを表示するには、PG_NAMESPACE システムカタログテーブルをクエリします。
select * from pg_namespace;
スキーマに属するテーブルのリストを表示するには、PG_TABLE_DEF システムカタログテーブルをクエリします。たとえば、次のクエリは PG_CATALOG スキーマのテーブルのリストを返します。
select distinct(tablename) from pg_table_def where schemaname = 'pg_catalog';
検索パス
検索パスは search_path パラメータで定義します。このパラメータに、スキーマ名をカンマで区切ってリストします。検索パスは、オブジェクト (テーブルや関数など) がスキーマ修飾子なしの簡潔な名前で参照されたときにスキーマを検索する順序を指定します。
ターゲットスキーマを指定せずにオブジェクトを作成した場合は、検索パスにリストされている最初のスキーマにオブジェクトが追加されます。同じ名前の複数のオブジェクトが異なるスキーマ内に存在する場合、スキーマが指定されていないオブジェクト名は、その名前のオブジェクトを含む検索パス内の最初のスキーマを参照します。
現行セッションのデフォルトスキーマを変更するには、SET コマンドを使用します。
詳細については、「設定リファレンス」の「search_path」の説明を参照してください。
スキーマベースのアクセス許可。
スキーマベースのアクセス許可は、スキーマ所有者により以下のように決定されます。
-
デフォルトでは、データベースの PUBLIC スキーマに対して、すべてのユーザーが CREATE と USAGE のアクセス許可を持ちます。データベースの PUBLIC スキーマ内に、オブジェクトをユーザーが作成することを禁止するには、REVOKE コマンドを使用して、そのアクセス許可を削除します。
-
オブジェクトの所有者により USAGE のアクセス許可が付与されたユーザーでない限り、ユーザーは、自らが所有していないスキーマに含まれるオブジェクトにアクセスできません。
-
別のユーザーが作成したスキーマに対する CREATE のアクセス許可が付与されたユーザーは、そのスキーマ内にオブジェクトを作成できます。