sql >> データベース >  >> RDS >> PostgreSQL

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

    スキーマ検索パスとはsearch_path

    マニュアル:

    [...]テーブルは、テーブル名だけで構成される非修飾名で参照されることがよくあります。システムは、検索パス(検索するスキーマのリスト)をたどることによって、どのテーブルが意味するのかを判断します。 。

    大胆な強調鉱山。これは識別子の解決を説明しています 。

    「現在のスキーマ」 (または「デフォルトスキーマ」)は、ドキュメントごとに:

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

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

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

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

    設定方法

    ランタイム変数search_pathを設定するにはさまざまな方法があります

    1. クラスターを設定します -postgresql.conf内のすべてのデータベースのすべての役割の全体的なデフォルト (そしてリロード)。気をつけて!

      search_path = 'blarg,public'
      

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

      search_path = "$user",public
      

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

    2. 1つのデータベースのデフォルトとして設定します :

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

      ALTER ROLE foo SET search_path = blarg,public;
      
    4. または、データベース内の役割のデフォルトとして(多くの場合は最高です!) :

      ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
      
    5. スクリプトの先頭にコマンドを記述します。または、DBセッションで実行します :

      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 search_path;
    

    マニュアル:

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



    1. T-SQLスキップストアドプロシージャ

    2. Oracleで2つのデータベースオブジェクトを比較する方法は?

    3. jQueryでラジオボタンがチェックまたは選択されているかどうかを確認するにはどうすればよいですか?

    4. 重複クエリの最適化パート1:導入と拡張T-SQLソリューション