¿Cuál es la ruta de búsqueda para una base de datos y un usuario determinados?

44

Puedo ver la corriente search_pathcon:

show search_path ;

Y puedo configurar el search_pathpara la sesión actual con:

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

Además, puedo configurar permanentemente search_pathpara una base de datos dada con:

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

Y puedo configurar permanentemente search_pathun rol determinado (usuario) con:

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

Pero me gustaría saber cómo determinar cuáles son las bases de datos y las configuraciones de roles (con respecto a search_path) antes de modificarlas.

usuario664833
fuente

Respuestas:

36

Puede encontrar opciones de configuración para roles y bases de datos en la tabla de catálogo pg_db_role_setting.

Esta consulta recupera cualquier configuración para un rol o base de datos dado:

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

Si no se establece nada, la siguiente instancia inferior determina el estado predeterminado de search_path, que es postgresql.confen este caso u opciones de línea de comandos al inicio del servidor. Relacionado:

Para desarmar cualquier configuración de un papel o base de datos - la search_pathen este ejemplo particular:

ALTER ROLE myrole RESET search_path;

O:

ALTER DATABASE mydb RESET search_path;

O:

ALTER ROLE myrole in DATABASE mydb RESET search_path;

Nunca manipule datos en el catálogo del sistema ( pg_catalog.*) manualmente. Utilice los comandos DDL como se indica en el manual para ALTER ROLEy ALTER DATABASE.
Esencialmente, el RESETcomando elimina una fila para pg_db_role_settingpermitir que la configuración base vuelva a tener efecto. No lo llamaría complicado.

Erwin Brandstetter
fuente
Guau. No imaginé que sería tan complicado. ¿Cómo desarmaría una base de datos y una configuración de roles ? Después de ejecutar alter role myrole set search_path = "$user", public, postgis ;, noté que pg_roles.rolconfig(correspondiente a mi rol) obtuve el valor {"search_path=\"$user\", public, postgis"}. Además, select * from pg_db_role_setting ;ahora muestra una fila adicional. Y después de ejecutar alter database mydb set search_path = "$user", public, postgis ;, veo una fila correspondiente select * from pg_db_role_setting ;; al final, no estoy seguro de cómo "deshacer" estos cambios.
user664833
@ user664833: agregué instrucciones para desarmar.
Erwin Brandstetter
6

Las configuraciones permanentes para las bases de datos y los roles se almacenan en la tabla de todo el clúster del sistema pg_db_role_settings .

Solo las configuraciones alteradas están presentes. Si la ruta de búsqueda nunca se modificó para una base de datos o un rol, supongo que se puede suponer "$user",public.

  • El valor de la configuración antes de cualquier cambio, incluso a nivel de clúster (a través de la configuración global postgresql.conf) se puede consultar desde la base de datos con:

     SELECT boot_val FROM pg_settings WHERE name='search_path';
  • El valor de la configuración antes de cualquier cambio dentro de la sesión (a través del SETcomando) se puede consultar desde la base de datos con:

     SELECT reset_val FROM pg_settings WHERE name='search_path';
  • Cuando se establece un valor no predeterminado en postgresql.conf, no es sencillo obtener ese valor en SQL independientemente de la sesión actual . pg_settings.boot_valno lo hará porque ignora los cambios en el archivo de configuración, y pg_settings.reset_valtampoco lo hará, porque está influenciado por la configuración de la base de datos / usuario potencialmente establecida ALTER USER/ALTER DATABASE. La forma más simple para que un DBA obtenga el valor es simplemente buscarlo postgresql.conf. De lo contrario, vea Restablecer ruta de búsqueda al valor predeterminado global del clúster que cubre este tema en detalle.

Daniel Vérité
fuente
¿No es boot_valrealmente el valor predeterminado de fábrica compilado, no la configuración postgresql.conf?
Erwin Brandstetter
@Erwin: sí. Uno podría querer mirar en reset_vallugar de boot_val.
Daniel Vérité
Hmm, la configuración de base de datos o papel sobrescribir el valor reset_val. Me topé con esta vieja pregunta investigando esta reciente: dba.stackexchange.com/questions/145280/…
Erwin Brandstetter
@Erwin: ISTM dice que obtener el valor de postgresql.conf probablemente sea un problema XY en la mayoría de los casos. De todos modos, edité la respuesta para vincular a la pregunta más nueva y ampliar un poco.
Daniel Vérité
3
select * from pg_user;

Es cierto para postgres y Redshift. Esto parece demasiado simple en comparación con las respuestas anteriores que dependen pg_db_role_setting, pero la useconfigcolumna tendrá una lista de configuraciones de usuario search_path, incluida , formateada como una lista.

pg_user La documentación de Postgres está aquí

Para ser más selectivo:

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

Creo que esta tabla de usuarios contiene todos los usuarios en el clúster, no solo db específico, pero no lo verifiqué.

Esmerejón
fuente
El rol no es exactamente el mismo que el usuario. ;)
Vic
Vic, ¿podrías explicarlo? El documento de Postgres es breve y parece decir que usuario y rol ya no son conceptos distintos, pero no soy un DBA y me encantaría recibir más información. postgresql.org/docs/current/static/user-manag.html
Merlin
2
Cualquier 'rol' puede actuar como un usuario, un grupo o ambos. Pero se supone que un usuario tiene otra distinción. Al revisar el catálogo, vemos que las vistas pg_role y pg_user hacen referencia a la tabla pg_authid, pero con el predicado rolcanlogin para los usuarios. Los 'usuarios' pueden iniciar sesión en su base de datos y, en general, los 'roles' definen conjuntos de autorizaciones que los usuarios heredan.
Vic