PostgreSQL | スキーマ | スキーマ検索パスを設定する

スキーマ名を省略してテーブルなどのオブジェクトを指定する場合に、実際にはどのスキーマ内のオブジェクトなのかを探すために使用されるスキーマ検索パスの設定方法と使い方について説明する。

スキーマ検索パスとは

テーブルなどのオブジェクトはスキーマに作成される。スキーマごとに同じ名前のテーブルを作成できるため、どのテーブルかを明確にするには スキーマ名.テーブル名 のように指定する必要がある。

たとえば、schemaA スキーマに staff テーブルがあり、schemaB スキーマにも同じ名前の staff テーブルがある場合、単に staff テーブルを指定すると、どちらのスキーマの staff テーブルなのかわからない。

select * from staff;

テーブルを明確に指定するには、schemaA.staffschemaB.staff のように スキーマ名.テーブル名 で指定する必要がある。

select * from schemaA.staff;

毎回スキーマ名を入力するのは手間なので、スキーマ名を省略するためにどのスキーマを使うかを設定できる。この設定がスキーマ検索パスである。スキーマ検索パスには複数のスキーマを設定しておくことができる。

スキーマ名1, スキーマ名2 ...

たとえば、スキーマを省略してテーブル名だけを記述すると、スキーマ検索パスの先頭から順に、各スキーマにそのテーブル名が存在するかどうかを確認する。一致するテーブルが見つかると、そのスキーマ内のテーブル名として判断される。

それでは具体的に、スキーマ検索パスの使い方と設定方法について見てみる。

スキーマ検索パスの現在の設定値を確認する

スキーマ検索パスに設定されている値を確認するには、次のように実行する。

devkuma=# show search_path;
   search_path
-----------------
 "$user", public
(1개 행)


devkuma=#

次のように表示された。

 "$user", public

スキーマ検索パスはスキーマをカンマ (,) で区切っている。先頭に記述されている "$user" は、現在のロールと同じ名前のスキーマを表す。現在は postgres ロールで接続しているため、次のように記述されているのと同じである。

postgres, public

スキーマ検索パスが使用される方法

スキーマ検索パスは、SELECT などで既存のテーブルを探す場合と、CREATE などで新しいテーブルを作成する場合とで、使われ方が少し異なる。

まずテーブルを探す場合である。テーブルからデータを検索する場合に、スキーマ名を省略してテーブル名だけを記述すると、スキーマ検索パスに並んでいるスキーマを先頭から順に確認し、テーブルが存在するかどうかを調べる。

たとえば、スキーマ検索パスが次のようになっているとする。

schemaA, schemaB, schemaC

ここで次のようにスキーマを省略してテーブル名を指定し、データを検索するとする。

select * from mytbl;

まず schemaA スキーマに mytbl があるかどうかを確認する。見つかれば schemaA.mytbl からデータを取得する。見つからなければ、schemaB スキーマに mytbl があるかどうかを確認する。この処理を、スキーマ検索パスに設定されているスキーマの数だけ繰り返す。

最後まで見つからなかった場合はエラーが発生する。スキーマ検索パスに記載されていないスキーマはチェックされない。

次はテーブルを作成する場合である。スキーマ名を省略してテーブル名を記述すると、スキーマ検索パスに並んでいるスキーマが存在するかどうかを確認する。実在するスキーマが見つかった場合、そのスキーマにテーブルを作成する。

たとえば、スキーマ検索パスが次のようになっているとする。

schemaA, schemaB, schemaC

まず schemaA から確認し、実際に存在するスキーマが見つかると、そのスキーマが現在のスキーマになる。

ここで次のようにスキーマ名を省略してテーブルを作成すると、現在のスキーマにテーブルが作成される。

create table mytbl (...);

それではテーブルを作成してみる。現在、スーパーユーザー postgres ロールで devkuma データベースに接続している。スキーマ検索パスはデフォルト状態なので、次のようになっている。

"$user", public

devkuma データベースにはロール名と同じ postgres スキーマが作成されていないため、スキーマ検索パスで最初に実在するスキーマは public である。したがって、スキーマを省略してテーブルを作成すると、public スキーマにテーブルが作成される。

次のように実行してテーブルを作成する。

devkuma=# create table memo (id integer, memo text);
CREATE TABLE
devkuma=#

テーブルが作成された。確認のため、psql メタコマンドである \dt を実行してみる。

devkuma=# \dt
      릴레이션(relation) 목록
 스키마 | 이름 |  종류  |  소유주
--------+------+--------+----------
 public | memo | 테이블 | postgres
(1개 행)


devkuma=#

public スキーマに、先ほど作成した memo テーブルが作成されていることを確認できる。

スキーマ検索パスを変更する

スキーマ検索パスを現在のセッション中だけ一時的に変更するには、SET コマンドを使用する。

SET search_path TO スキーマ名1, スキーマ名2, ...;

たとえば、スキーマ検索パスを myschema, public に設定するには、次のように実行する。

devkuma=# set search_path to myschema, public;
SET
devkuma=#

スキーマ検索パスが変更された。確認のため、show search_path を実行してみる。

devkuma=# show search_path;
   search_path
------------------
 myschema, public
(1개 행)


devkuma=#

スキーマ検索パスが指定した値に変更されていることを確認できる。

次に、スキーマ検索パスを永続的に変更する場合は、ALTER ROLE コマンドを使用する。

ALTER ROLE user SET search_path = スキーマ名1, スキーマ名2 ...;

たとえば、スキーマ検索パスを myschema, public に設定するには、次のように実行する。

devkuma=# alter role postgres set search_path to myschema, public;
ALTER ROLE
devkuma=#

スキーマ検索パスを変更した。確認のため、一度 PostgreSQL との接続を終了し、再度接続して show search_path を実行してみる。

devkuma=# alter role postgres set search_path to myschema, public;
ALTER ROLE
devkuma=# \q

C:\Users\kimkc>psql -U postgres
postgres 사용자의 암호:
psql (12.2)
도움말을 보려면 "help"를 입력하십시오.

postgres=# show search_path;
   search_path
------------------
 myschema, public
(1개 행)


postgres=#

スキーマ検索パスが指定した値に変更されていることを確認できる。

デフォルト値に戻すには、次のように実行する。

alter role postgres set search_path to default;

すべてのユーザーのデフォルトスキーマ検索パスを変更するには、PostgreSQL 設定ファイルである postgresql.conf を修正する。postgresql.conf ファイルの場所などについては、postgresql.conf ファイルの設定方法 を参照する。

postgresql.conf ファイルをテキストエディタで開き、次の場所を探す。


#------------------------------------------------------------------------------
# CLIENT CONNECTION DEFAULTS
#------------------------------------------------------------------------------

# - Statement Behavior -

#client_min_messages = notice		# values in order of decreasing detail:
					#   debug5
					#   debug4
					#   debug3
					#   debug2
					#   debug1
					#   log
					#   notice
					#   warning
					#   error
#search_path = '"$user", public'	# schema names
#row_security = on
#default_tablespace = ''		# a tablespace name, '' uses the default
#search_path = '"$user", public'	# schema names

現在の search_path 設定はコメントになっているため、先頭の # を削除する。そして、デフォルトのスキーマ検索パスとして設定したい値を指定する。ここでは次のように設定する。

search_path = 'myschema, clientschema'    # schema names

変更したら postgresql.conf ファイルを保存し、PostgreSQL を再起動する。

その後 PostgreSQL に接続し、show search_path を実行してみる。

C:\Users\kimkc>psql -U postgres
postgres 사용자의 암호:
psql (12.2)
도움말을 보려면 "help"를 입력하십시오.

postgres=# show search_path;
   search_path
------------------
 myschema, clientschema
(1개 행)


postgres=#

スキーマ検索パスのデフォルト値が変更されていることを確認できる。

ここまで、スキーマ検索パスの設定と使い方について説明した。