Quel est le chemin de recherche pour une base de données et un utilisateur donnés?

44

Je peux voir le courant search_pathavec:

show search_path ;

Et je peux définir le search_pathpour la session en cours avec:

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

De plus, je peux définir de manière permanente le search_pathpour une base de données donnée avec:

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

Et je peux définir de manière permanente le search_pathpour un rôle donné (utilisateur) avec:

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

Mais j'aimerais savoir comment déterminer quels sont les paramètres de base de données et de rôle (en ce qui concerne search_path) avant de les modifier?

utilisateur664833
la source

Réponses:

36

Vous pouvez trouver les paramètres de configuration pour les rôles et les bases de données dans la table du catalogue pg_db_role_setting.

Cette requête récupère tous les paramètres pour un rôle ou une base de données donnés:

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 rien n'est défini, l'instance inférieure suivante détermine l'état par défaut de search_path, qui est postgresql.confdans ce cas ou les options de ligne de commande au démarrage du serveur. En relation:

Pour supprimer les paramètres d'un rôle ou d'une base de données - search_pathdans cet exemple particulier:

ALTER ROLE myrole RESET search_path;

Ou:

ALTER DATABASE mydb RESET search_path;

Ou:

ALTER ROLE myrole in DATABASE mydb RESET search_path;

Ne manipulez jamais les données du catalogue système ( pg_catalog.*) manuellement. Utilisez les commandes DDL comme indiqué dans le manuel pour ALTER ROLEet ALTER DATABASE.
Essentiellement, la RESETcommande supprime une ligne pg_db_role_settingpermettant au paramètre de base de reprendre effet. Je n'appellerais pas ça compliqué.

Erwin Brandstetter
la source
Sensationnel. Je n'imaginais pas que ce serait aussi compliqué. Comment désinstaller une base de données et un paramètre de rôle donnés ? Après exécution, alter role myrole set search_path = "$user", public, postgis ;j'ai remarqué que pg_roles.rolconfig(correspondant à mon rôle) avait obtenu la valeur {"search_path=\"$user\", public, postgis"}. En outre, select * from pg_db_role_setting ;affiche maintenant une ligne supplémentaire. Et après exécution, alter database mydb set search_path = "$user", public, postgis ;je vois une ligne correspondante select * from pg_db_role_setting ;- à la fin, je ne sais pas comment "annuler" ces modifications.
user664833
@ user664833: J'ai ajouté des instructions pour désactiver.
Erwin Brandstetter
6

Les paramètres permanents des bases de données et des rôles sont stockés dans la table pg_db_role_settings à l' échelle du cluster.

Seuls les paramètres modifiés sont présents. Si le chemin de recherche n'a jamais été modifié pour une base de données ou un rôle, j'imagine qu'il peut l'être "$user",public.

  • La valeur du paramètre avant toute modification, y compris au niveau du cluster (via la configuration globale postgresql.conf) peut être interrogée à partir de la base de données avec:

     SELECT boot_val FROM pg_settings WHERE name='search_path';
  • La valeur du paramètre avant toute modification dans la session (via la SETcommande) peut être interrogée à partir de la base de données avec:

     SELECT reset_val FROM pg_settings WHERE name='search_path';
  • Lorsqu'une valeur autre que celle par défaut est définie postgresql.conf, il n'est pas simple d'obtenir cette valeur en SQL indépendamment de la session en cours . pg_settings.boot_valne le fera pas car il ignore les modifications apportées au fichier de configuration et pg_settings.reset_valne le fait pas non plus, car il est influencé par les paramètres de base de données / utilisateur potentiellement définis ALTER USER/ALTER DATABASE. Pour un administrateur de base de données, le moyen le plus simple d'obtenir cette valeur consiste à le rechercher postgresql.conf. Sinon, voir Réinitialiser search_path sur la valeur globale par défaut du cluster, qui couvre ce sujet en détail.

Daniel Vérité
la source
Est-ce que ce n'est pas boot_valréellement le défaut d'usine compilé, ni le réglage postgresql.conf?
Erwin Brandstetter
@ Erwin: oui. On pourrait vouloir regarder au reset_vallieu de boot_val.
Daniel Vérité
Hmm, les paramètres de la base de données ou du rôle écrasent la valeur dans reset_val. Je suis tombé sur cette vieille question à la recherche de celle-ci: dba.stackexchange.com/questions/145280/…
Erwin Brandstetter
@Erwin: ISTM, il est probable que l'obtention de la valeur de postgresql.conf pose un problème XY dans la plupart des cas. Quoi qu'il en soit, j'ai modifié la réponse pour créer un lien vers la nouvelle question et développer un peu.
Daniel Vérité
3
select * from pg_user;

Vrai pour postgres et redshift. Cela semble trop simple comparé aux réponses précédentes qui en dépendent pg_db_role_setting, mais la useconfigcolonne aura une liste de configurations d’utilisateurs incluant search_path, formatées en liste.

La documentation de Postgres est ici

Pour être plus sélectif:

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

Je pense que cette table d'utilisateurs contient tous les utilisateurs du cluster, pas seulement la base de données spécifique - mais je n'ai pas vérifié cela.

Merlin
la source
Le rôle n'est pas exactement le même que l'utilisateur. ;)
Vic
Vic pourriez-vous élaborer? La doc de Postgres est succincte et semble indiquer que l’utilisateur et le rôle ne sont plus des concepts distincts, mais je ne suis pas un administrateur de base de données et j’aimerais avoir plus d’informations. postgresql.org/docs/current/static/user-manag.html
Merlin
2
N'importe quel "rôle" peut agir en tant qu'utilisateur, groupe ou les deux. Mais un utilisateur est implicite d'avoir une autre distinction. En examinant le catalogue, nous voyons que les vues pg_role et pg_user font référence à la table de référence pg_authid, mais avec le prédicat rolcanlogin pour les utilisateurs. Les utilisateurs peuvent se connecter à votre base de données et généralement, les rôles définissent des ensembles d'autorisations dont ils héritent.
Vic