web-dev-qa-db-ja.com

特定のデータベースとユーザーのsearch_pathは何ですか?

現在のsearch_pathは次のようにして確認できます。

show search_path ;

そして、私は現在のセッションsearch_pathを次のように設定できます:

set search_path = "$user", public, postgis;

同様に、特定のdatabaseに対してsearch_pathを永続的に設定できます。

alter database mydb set search_path = "$user", public, postgis ;

そして、私は与えられたrole(user)に対してsearch_pathを永久に設定できます:

alter role johnny set search_path = "$user", public, postgis ;

しかし、変更する前にdatabaseおよびrole設定が(search_pathに関して)何であるかを判断する方法を知りたいですか?

51
user664833

ロールとデータベースの構成設定は、カタログテーブル pg_db_role_setting にあります。

このクエリは、特定のロールまたはデータベースの設定を取得します。

SELECT r.rolname, d.datname, rs.setconfig
FROM   pg_db_role_setting rs
LEFT   JOIN pg_roles      r ON r.oid = rs.setrole
LEFT   JOIN pg_database   d ON d.oid = rs.setdatabase
WHERE  r.rolname = 'myrole' OR d.datname = 'mydb';

何も設定されていない場合、次に低いインスタンスがsearch_pathのデフォルトの状態を決定します。この場合はpostgresql.confであり、サーバー起動時のコマンドラインオプションです。関連:

Tounsetロールまたはデータベースの任意の設定-この特定の例ではsearch_path

ALTER ROLE myrole RESET search_path;

または:

ALTER DATABASE mydb RESET search_path;

または:

ALTER ROLE myrole in DATABASE mydb RESET search_path;

決してシステムカタログ(pg_catalog.*)のデータを手動で操作しないでください。 ALTER ROLE および ALTER DATABASE のマニュアルに記載されているDDLコマンドを使用します。
基本的に、RESETコマンドはpg_db_role_settingから行を削除し、基本設定を再び有効にします。それを複雑だとは思いません。

44

データベースとロールの両方の永続的な設定は pg_db_role_settings システムのクラスター全体のテーブルに保存されます。

このテーブルには、ALTER USERおよびALTER DATABASEに渡された設定のみが存在します。これらのコマンド以外に設定されている値を取得するには:

  • (グローバル構成postgresql.confを介した)クラスターレベルを含む、変更前の設定の値は、次のようにしてデータベースからクエリできます。

     SELECT boot_val FROM pg_settings WHERE name='search_path';
    
  • セッション内での変更前の設定値(SETコマンドを使用)は、次のようにしてデータベースからクエリできます。

     SELECT reset_val FROM pg_settings WHERE name='search_path';
    
  • postgresql.confにデフォルト以外の値が設定されている場合、現在のセッションとは無関係にSQLでその値を取得することは簡単ではありませんpg_settings.boot_valは、構成ファイルの変更を無視するので機能しません。pg_settings.reset_valも、ALTER USER/ALTER DATABASEによって設定される可能性のあるデータベース/ユーザー設定の影響を受けるため、機能しません。 DBAが値を取得する最も簡単な方法は、postgresql.confで調べるだけです。それ以外の場合は、このトピックを詳しく説明する search_pathをグローバルにリセットし、クラスターのデフォルト を参照してください。

7
Daniel Vérité
select * from pg_user;

PostgresとRedshiftの場合はtrueです。これは、pg_db_role_settingに依存する以前の回答に比べて単純すぎるようですが、useconfig列には、search_pathを含むユーザー構成のリストがリストとしてフォーマットされます。

pg_user Postgresのドキュメントはこちら

より選択的にするには:

rs.db.batarang.com cooldb:cooldude =#> select usename
                                              , useconfig 
                                       from   pg_user
                                       where  usename = 'cooldude';
┌────────────┬─────────────────────────────────────────────────────┐
│  usename   │                      useconfig                      │
├────────────┼─────────────────────────────────────────────────────┤
│ cooldude   │ {"search_path=dirt, test, \"$user\", public, prod"} │
└────────────┴─────────────────────────────────────────────────────┘

このユーザーテーブルには、特定のdbだけでなく、クラスター内のすべてのユーザーが含まれていると思いますが、確認していません

4
Merlin