web-dev-qa-db-ja.com

search_pathは識別子の解決と「現在のスキーマ」にどのように影響しますか

デフォルトで新しいスキーマを作成するスキーマを定義することはできますか? (「非修飾テーブル名」によって参照されます。)

Postgresでの「検索パス」の使用に関する詳細を見てきましたが、作成ではなくデータの取得中にのみ機能すると思います。

多くのテーブルを作成するSQLスクリプトがたくさんあります。スクリプトを変更する代わりに、デフォルトでは特定のスキーマ内にデータベース作成テーブルを設定します-非修飾名がある場合。

これは可能ですか?

45
thyandrecardoso

検索パスはまさにあなたが望むものです:

% create schema blarg;
% set search_path to blarg;
% create table foo (id int);
% \d
       List of relations
 Schema | Name | Type  | Owner 
--------+------+-------+-------
 blarg  | foo  | table | pgsql
27
Alex Howansky

検索パスとは何ですか?

ドキュメントごと:

[...]テーブルは多くの場合、テーブル名のみで構成される非修飾名で参照されます。システムは、調べるスキーマのリストである検索パスをたどることにより、どのテーブルを意味するかを決定します。

大胆な強調鉱山。これは識別子解決を説明し、“現在のスキーマ”は、ドキュメントごとに

検索パスで指定された最初のスキーマは、現在のスキーマと呼ばれます。最初に検索されるスキーマであることに加えて、CREATE TABLEコマンドでスキーマ名が指定されていない場合、新しいテーブルが作成されるスキーマでもあります。

大胆な強調鉱山。システムスキーマpg_temp(現在のセッションの一時オブジェクトのスキーマ)およびpg_catalogは、自動的に検索パスの一部であり、検索されます最初の、この順序で。 ドキュメントごと:

pg_catalogは常に事実上検索パスの一部です。パスで明示的に名前が付けられていない場合は、パスのスキーマを検索するbeforeが暗黙的に検索されます。これにより、組み込みの名前が常に検索可能になります。ただし、組み込みの名前をユーザー定義の名前で上書きしたい場合は、pg_catalogを検索パスの末尾に明示的に配置できます。

オリジナルごとの大胆な強調。そして、pg_tempは、別の位置に置かれない限り、その前に来ます。

設定方法

ランタイム変数 search_path を実際に設定するためのさまざまなオプションがあります。

  1. postgresql.conf のすべてのデータベースのすべてのロールにcluster- wideデフォルトを設定します(および再読み込み)。それに注意してください!

    search_path = 'blarg,public'
    

    この設定の shippedデフォルト は次のとおりです。

    search_path = "$user",public
    

    最初の要素は、現在のユーザーと同じ名前のスキーマを検索することを指定します。そのようなスキーマが存在しない場合、エントリは無視されます。

  2. 1つのdatabaseのデフォルトとして設定します:

    ALTER DATABASE test SET search_path = blarg,public;
    
  3. 接続するroleのデフォルトとして設定します(クラスター全体で有効):

    ALTER ROLE foo SET search_path = blarg,public;
    
  4. または指定されたデータベースのロールのみのデフォルトとして(多くの場合最高!):

    ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
    
  5. スクリプトの先頭にコマンドを記述します(またはsessionの任意の時点でコマンドを実行します:

    SET search_path = blarg,public;
    
  6. 関数のスコープに特定のsearch_pathを設定します(十分な特権を持つ悪意のあるユーザーから保護するため)。マニュアルの _SECURITY DEFINER関数の安全な作成 について読んでください。

CREATE FUNCTION foo() RETURNS void AS
$func$
BEGIN
   -- do stuff
END
$func$ LANGUAGE plpgsql SECURITY DEFINER
       SET search_path=blarg,public,pg_temp;

私のリストの数字が大きいほど数字は小さくなります。
マニュアルには、環境変数の設定やコマンドラインオプションの使用など、さらに多くの方法 があります。

現在の設定を確認するには:

SHOW search_path;

reset it:

RESET search_path;

ドキュメントごと

デフォルト値は、現在のセッションでSETが発行されていなかった場合にパラメーターが持っていた値として定義されます。

70