オープンソースのERP iDempiereの開発を行っていると、直接PostgreSQLに対してSQLを発行したい時があります。私の場合、現在はpgAdmin4を使用しているのですが、その際にテーブルが属するスキーマをいちいち指定するのは、とても面倒です。
例:SELECT * FROM adempiere.C_Order
この例で、"adempiere."とスキーマを指定しているところの指定が面倒なんですね。テーブルが1つだけなら良いのですが、テーブルが結合していたりするととても面倒です…。
そのような場合、サーチパスを設定しておく事で、この煩わしさから解放されますので、ここではPostgreSQLのサーチパスについて調査及び研究し、その成果をまとめています。
セッション毎のサーチパス(search_path)の設定
pgAdmin4で、クエリーを発行する際に、サーチパス(search_path)を設定する場合、クエリを発行する前に、下記のようにパスを設定する事で、テーブルにいちいちスキーマ名を設定する必要はありません。
SET search_path = adempiere;
SELECT * FROM C_Order
一度サーチパスを設定すれば、そのセッションが閉じられるまで有効です。具体的にはpgAdmin4であれば、クエリのパネルを閉じるまでは有効のようです。
ユーザー/ロール毎のサーチパス(search_path)の設定
セッション毎にサーチパスを設定するのは、それはそれで面倒なので、ユーザー/ロール毎にサーチパスを設定する事ができます。
ALTER USER [ユーザ名] SET search_path TO [スキーマ名];
iDempiereのインストールのDBのセットアップでも、下記のようにsearch_pathを設定しています。
$ psql -d idempiere -U adempiere -c "ALTER ROLE adempiere SET search_path TO adempiere, pg_catalog"
デフォルトのサーチパス(search_path)の設定
postgresql.confのパラメータを編集する事で、デフォルトのサーチパスとしてPostgreSQLの全ユーザーに対してサーチパスを設定しておく事ができます。
#------------------------------------------------------------------------------
# CLIENT CONNECTION DEFAULTS
#------------------------------------------------------------------------------
# - Statement Behavior -
#search_path = '"$user",public' # schema names
#default_tablespace = '' # a tablespace name, '' uses the default
#temp_tablespaces = '' # a list of tablespace names, '' uses
…以下略
デフォルトでは、"$user"と"public"でユーザー名と同じスキーマとpublicのスキーマが使用できるようになっています。これは"#"でコメントアウトされていてもデフォルトの設定として有効になっているとのことです。ここで"#"のコメントを外して、下記のようにすれば、adempiereのスキーマを誰でも使用する事ができるようになります。
#------------------------------------------------------------------------------
# CLIENT CONNECTION DEFAULTS
#------------------------------------------------------------------------------
# - Statement Behavior -
search_path = '"$user",public,adempiere' # schema names
#default_tablespace = '' # a tablespace name, '' uses the default
#temp_tablespaces = '' # a list of tablespace names, '' uses
…以下略