スキーマ検索パスとはsearch_path
?
マニュアル:
[...]テーブルは、テーブル名だけで構成される非修飾名で参照されることがよくあります。システムは、検索パス(検索するスキーマのリスト)をたどることによって、どのテーブルが意味するのかを判断します。 。
大胆な強調鉱山。これは識別子の解決を説明しています 。
「現在のスキーマ」 (または「デフォルトスキーマ」)は、ドキュメントごとに:
検索パスで指定された最初のスキーマ 現在のスキーマと呼ばれます 。最初に検索されるスキーマであるだけでなく、
CREATE TABLE
の場合に新しいテーブルが作成されるスキーマでもあります。 コマンドはスキーマ名を指定しません。
大胆な強調鉱山。システムスキーマpg_temp
(現在のセッションの一時オブジェクトのスキーマ)および pg_catalog
自動的に検索パスの一部になり、最初に検索されます 、この順序で。マニュアル:
pg_catalog
常に事実上検索パスの一部です。パスで明示的に名前が付けられていない場合は、前に暗黙的に検索されます パスのスキーマを検索します。これにより、組み込みの名前を常に見つけることができます。ただし、pg_catalog
を明示的に配置することはできます ユーザー定義の名前を組み込みの名前で上書きする場合は、検索パスの最後にあります。
オリジナルのように大胆な強調。そしてpg_temp
別の位置に置かれない限り、その前に来ます。
設定方法
ランタイム変数search_path
を設定するにはさまざまな方法があります 。
-
クラスターを設定します -
postgresql.conf
内のすべてのデータベースのすべての役割の全体的なデフォルト (そしてリロード)。気をつけて!search_path = 'blarg,public'
この設定の出荷時のデフォルトは次のとおりです。
search_path = "$user",public
最初の要素は、現在のユーザーと同じ名前のスキーマを検索することを指定します。そのようなスキーマが存在しない場合、エントリは無視されます。
-
1つのデータベースのデフォルトとして設定します :
ALTER DATABASE test SET search_path = blarg,public;
-
役割のデフォルトとして設定します 接続する(クラスター全体で有効):
ALTER ROLE foo SET search_path = blarg,public;
-
または、データベース内の役割のデフォルトとして(多くの場合は最高です!) :
ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
-
スクリプトの先頭にコマンドを記述します。または、DBセッションで実行します :
SET search_path = blarg,public;
-
特定の
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 search_path;
マニュアル:
デフォルト値は、
SET
がない場合に、パラメーターが持つであろう値として定義されます。 現在のセッションで発行されたことはありますか。