特定のデータベースとユーザーの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.