サーチパス(検索パス)を設定する

PostgreSQL

PostgreSQLにおいて、とあるスキーマに属しているテーブルを検索する際に、テーブルの前にスキーマを指定して検索を行うことができます。ですが、サーチパス(検索パス)を適切に設定することでスキーマの指定を省略することができます。

スポンサーリンク

サーチパス(検索パス)とは

サーチパス(検索パス)とは、検索するスキーマのリストです。

スキーマが明示的に指定されなかった場合に使用され、サーチパスに従ってどのテーブルを指しているのかを判別します。

サーチパスで最初に一致したテーブルが、該当テーブルだと解釈します。

-- スキーマ:schema1
-- テーブル:test_table

-- スキーマ名を指定
SELECT COUNT(*) FROM schema1.test_table;

 count
-------
     3

-- スキーマ名を指定なし(サーチパス内にschema1がある場合)
SELECT COUNT(*) FROM test_table;

 count
-------
     3

-- スキーマ名を指定なし(サーチパス内にschema1がない場合)
SELECT COUNT(*) FROM test_table;

ERROR:  relation "test_table" does not exist
LINE 1: SELECT COUNT(*) FROM test_table;
スポンサーリンク

デフォルトの設定

サーチパスのデフォルト設定は、①接続したユーザーと同名のスキーマ ②publicスキーマ となっています。

確認方法

現在のサーチパスを確認するには、psqlでDBに接続し【SHOW search_path;】を使用します。

SHOW search_path;

 search_path
--------------
 "$user",public

※カンマ区切りで指定、先頭の方が優先度が高い
※”$user”は、接続したユーザーと同名のスキーマの意味

設定方法

サーチパスをデフォルトから変更するには以下の3つの設定方法があります。

全ユーザーで永続的に設定

全ユーザーで永続的に設定するには、PostgreSQLの設定ファイルであるpostgresql.confを編集します。

デフォルトで以下となっていますので、先頭のコメントの#を消し、設定したい値に編集します。

#search_path = '"$user", public'

※カンマ区切りで指定、先頭の方が優先度が高い
※”$user”は、接続したユーザーと同名のスキーマの意味

その後、設定を反映するためにPostgreSQLをリロードします。

pg_ctl reload

特定ユーザーで永続的に設定

特定ユーザーで永続的に設定するには、psqlでDBに接続しALTERを使用します。

ALTER USER ユーザー名 SET search_path TO サーチパス;

-- 使用例
ALTER USER user1 SET search_path TO "$user",schema1,public;

※接続中のpsqlでは有効にはならないので再ログインが必要

一時的に設定

一時的にpsqlのセッション内でだけで設定するには、【SET search_path TO サーチパス;】を使用します。

SET search_path TO サーチパス;

-- 使用例
SET search_path TO "$user",schema1,public;

注意点

同名のテーブル

同名のテーブルが複数のスキーマに存在する場合、サーチパスを把握しておかないと、どのテーブルにアクセスしているのか混乱します。

-- schema1.test_table データは1件格納されている
-- schema2.test_table データは2件格納されている
-- サーチパスはschema1,schema2

SELECT COUNT(*) FROM test_table;

 count
-------
     1  ← 優先度が高いschema1のtest_tableにアクセスしている

最後に

サーチパスを適切に設定することで毎回スキーマを指定する煩雑さから解放されます。また、アプリケーションの中ではスキーマを記述しないことも多いのです。

ぜひ、おさえておきましょう。

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