Qual è il percorso di ricerca per un determinato database e utente?


44

Posso vedere la corrente search_pathcon:

show search_path ;

E posso impostare il search_pathper la sessione corrente con:

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

Inoltre, posso impostare permanentemente il search_pathper un determinato database con:

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

E posso impostare in modo permanente search_pathper un determinato ruolo (utente) con:

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

Ma vorrei sapere come determinare quali sono le impostazioni del database e del ruolo (rispetto a search_path) prima di modificarle?

Risposte:


36

È possibile trovare le impostazioni di configurazione per ruoli e database nella tabella del catalogo pg_db_role_setting.

Questa query recupera tutte le impostazioni per un determinato ruolo o database:

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

Se non viene impostato nulla, l'istanza inferiore successiva determina lo stato predefinito di search_path, che è postgresql.confin questo caso o le opzioni della riga di comando all'avvio del server. Relazionato:

Per annullare l' impostazione di qualsiasi impostazione di un ruolo o database, search_pathin questo esempio particolare:

ALTER ROLE myrole RESET search_path;

O:

ALTER DATABASE mydb RESET search_path;

O:

ALTER ROLE myrole in DATABASE mydb RESET search_path;

Non manipolare mai i dati nel catalogo di sistema ( pg_catalog.*) manualmente. Utilizzare i comandi DDL come indicato nel manuale per ALTER ROLEe ALTER DATABASE.
In sostanza, il RESETcomando elimina una riga dal pg_db_role_settingconsentire nuovamente l'impostazione di base. Non lo definirei contorto.


Wow. Non immaginavo che fosse così contorto. Come si disinserire un determinato database e l' impostazione del ruolo ? Dopo l'esecuzione alter role myrole set search_path = "$user", public, postgis ;ho notato che pg_roles.rolconfig(corrispondente al mio ruolo) ha ottenuto il valore {"search_path=\"$user\", public, postgis"}. Inoltre, select * from pg_db_role_setting ;ora mostra una riga aggiuntiva. E dopo l'esecuzione alter database mydb set search_path = "$user", public, postgis ;vedo una riga corrispondente in select * from pg_db_role_setting ;-, alla fine, non sono sicuro di come "annullare" questi cambiamenti.
user664833

@ user664833: ho aggiunto le istruzioni per annullare l'impostazione.
Erwin Brandstetter,

6

Le impostazioni permanenti sia per i database che per i ruoli sono archiviate nella tabella a livello di cluster del sistema pg_db_role_settings .

Sono presenti solo le impostazioni modificate. Se il percorso di ricerca non è mai stato modificato per un database o un ruolo, immagino che si possa presumere che lo sia "$user",public.

  • Il valore dell'impostazione prima di qualsiasi modifica, anche a livello di cluster (attraverso la configurazione globale postgresql.conf), può essere interrogato dal database con:

     SELECT boot_val FROM pg_settings WHERE name='search_path';
  • Il valore dell'impostazione prima di qualsiasi modifica all'interno della sessione (tramite il SETcomando) può essere interrogato dal database con:

     SELECT reset_val FROM pg_settings WHERE name='search_path';
  • Quando è impostato un valore non predefinito in postgresql.conf, non è semplice ottenere quel valore in SQL indipendentemente dalla sessione corrente . pg_settings.boot_valnon lo farà perché ignora le modifiche nel file di configurazione e pg_settings.reset_valnon lo farà neanche, perché è influenzato dalle impostazioni del database / utente potenzialmente impostate ALTER USER/ALTER DATABASE. Il modo più semplice per un DBA di ottenere il valore è semplicemente cercarlo postgresql.conf. Altrimenti, vedere Ripristina percorso di ricerca sul valore predefinito globale del cluster che tratta in dettaglio questo argomento.


In boot_valrealtà non è l'impostazione predefinita di fabbrica compilata, non l'impostazione in postgresql.conf?
Erwin Brandstetter,

@Erwin: si. Uno potrebbe voler guardare reset_valinvece di boot_val.
Daniel Vérité,

Hmm, le impostazioni del database o del ruolo sovrascrivono il valore in reset_val. Mi sono imbattuto in questa vecchia domanda ricercando questa recente: dba.stackexchange.com/questions/145280/…
Erwin Brandstetter

@Erwin: ISTM che ottenere il valore da postgresql.conf è probabilmente un problema XY nella maggior parte dei casi. Ad ogni modo, ho modificato la risposta per collegarmi alla domanda più recente ed espandere un po '.
Daniel Vérité,

3
select * from pg_user;

Vero per Postgres e Redshift. Questo sembra troppo semplice rispetto alle risposte precedenti da cui dipendono pg_db_role_setting, ma la useconfigcolonna avrà un elenco di configurazioni utente incluso search_path, formattato come un elenco.

pg_user La documentazione di Postgres è qui

Per essere più selettivi:

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"} 
└────────────┴─────────────────────────────────────────────────────┘

Penso che questa tabella di utenti contenga tutti gli utenti nel cluster, non solo un db specifico, ma non l'ho verificato.


Il ruolo non è esattamente lo stesso dell'utente. ;)
Vic

Vic potresti approfondire? I documenti di Postgres sono concisi e sembrano dire che l'utente e il ruolo non sono più concetti distinti, ma io non sono un DBA e mi piacerebbe avere più input. postgresql.org/docs/current/static/user-manag.html
Merlin

2
Qualsiasi "ruolo" può agire come un utente, un gruppo o entrambi. Ma un utente "implica un'altra distinzione. Esaminando il catalogo, vediamo che le viste pg_role e pg_user fanno entrambe riferimento alla tabella pg_authid, ma con il predicato rolcanlogin per gli utenti. Gli "utenti" possono accedere al database e in genere i "ruoli" definiscono le serie di autorizzazioni ereditate dagli utenti.
Vic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.