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


44

私は現在search_pathを見ることができます:

show search_path ;

そして、私search_path現在のセッションのために設定することができます:

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

同様に、search_path特定のデータベースのを次のように永続的に設定できます

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

そして、私はsearch_path特定の役割(ユーザー)に永久的に設定することができます:

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

しかし、それらを変更する前に、データベースロールの設定が(に関してsearch_path)であるかどうかを判断する方法を知りたいですか?

回答:


36

カタログテーブルでロールとデータベースの構成設定を見つけることができます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サーバーの開始時に、この場合、またはコマンドラインオプションでは。関連する:

ロールまたはデータベースの設定を解除 するには- 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およびのマニュアルで指示されているように、DDLコマンドを使用しますALTER DATABASE
基本的に、このRESETコマンドは行を削除してpg_db_role_setting、基本設定が再び有効になるのを許可します。私はそれを複雑なものとは呼びません。


ワオ。これが複雑になるとは思いませんでした。特定のデータベースロール設定をどのように設定解除ますか?実行後、(自分の役割に対応する)値が取得されたことに気付きました。また、追加の行が表示されるようになりました。実行後、対応する行が表示されます。最終的に、これらの変更を「元に戻す」方法がわかりません。alter role myrole set search_path = "$user", public, postgis ;pg_roles.rolconfig{"search_path=\"$user\", public, postgis"}select * from pg_db_role_setting ;alter database mydb set search_path = "$user", public, postgis ;select * from pg_db_role_setting ;
user664833

@ user664833:設定を解除する手順を追加しました。
アーウィンブランドステッター14年

6

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

変更された設定のみが存在します。データベースまたはロールの検索パスが一度も変更されていない場合、であると想定できると思います"$user",public

  • (グローバル構成を介した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でその値を取得するのは簡単ではありません。は、設定ファイルの変更を無視するため実行されません。また、を介して設定される可能性のあるデータベース/ユーザー設定の影響を受けるため、実行されません。DBAが値を取得する最も簡単な方法は、単にそれを検索することです。それ以外の場合は、search_pathをグローバルなクラスターのデフォルトにリセットするを参照してください 。このトピックで詳しく説明しています。pg_settings.boot_valpg_settings.reset_valALTER USER/ALTER DATABASEpostgresql.conf


ではないboot_val実際にコンパイル時に工場出荷時のデフォルトではなく、設定ではpostgresql.conf
アーウィンブランドステッター16

@アーウィン:はい。のreset_val代わりに見たいかもしれませんboot_val
ダニエルベリテ

うーん、データベースまたはロールの設定は、の値を上書きしますreset_val。:私はこの最近の1を研究し、この古い質問に出くわしdba.stackexchange.com/questions/145280/...
アーウィンBrandstetter

@Erwin:ISTMは、postgresql.confから値を取得することは、ほとんどの場合、XYの問題になる可能性が高いことを示しています。とにかく、答えを編集して新しい質問にリンクし、少し拡張しました。
ダニエルベリテ

3
select * from pg_user;

postgresとRedshiftに当てはまります。これは、に依存する以前の回答と比較すると単純すぎるように見えます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"} 
└────────────┴─────────────────────────────────────────────────────┘

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


役割はユーザーとまったく同じではありません。;)
Vic

Vicを詳しく説明してもらえますか?Postgresのドキュメントは簡潔であり、ユーザーとロールはもはや別個の概念ではないと言っているようですが、私はDBAではなく、より多くの入力が必要です。postgresql.org/docs/current/static/user-manag.html
マーリン

2
すべての「ロール」は、ユーザー、グループ、またはその両方として機能できます。しかし、ユーザーには、もう1つの区別があることが暗示されています。カタログを確認すると、ビューpg_roleとpg_userは両方ともテーブルpg_authidを参照していますが、ユーザー用の述部rolcanloginを使用しています。「ユーザー」はデータベースにログインでき、通常「ロール」はユーザーが継承する一連の許可を定義します。
ヴィック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.