現在の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
に関して)何であるかを判断する方法を知りたいですか?
ロールとデータベースの構成設定は、カタログテーブル 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
から行を削除し、基本設定を再び有効にします。それを複雑だとは思いません。
データベースとロールの両方の永続的な設定は 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をグローバルにリセットし、クラスターのデフォルト を参照してください。
select * from pg_user;
PostgresとRedshiftの場合はtrueです。これは、pg_db_role_setting
に依存する以前の回答に比べて単純すぎるようですが、useconfig
列には、search_path
を含むユーザー構成のリストがリストとしてフォーマットされます。
より選択的にするには:
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だけでなく、クラスター内のすべてのユーザーが含まれていると思いますが、確認していません