5.7.3. Le chemin de recherche des schémas

Les noms qualifiés sont fastidieux à écrire, et il est souvent préférable de ne pas filer un nom de schéma particulier dans les applications de toute façon. C’est pourquoi les tables sont souvent désignées par des noms non qualifiés, qui consistent uniquement en un nom de table. Le système détermine quelle table est visée en suivant un chemin de recherche, qui est une liste de schémas dans lesquels chercher.la première table correspondante dans le chemin de recherche est considérée comme étant celle recherchée. S’il n’y a pas de correspondance dans le chemin de recherche, une erreur est signalée, même si des noms de table correspondants existent dans d’autres schémas de la base de données.

La possibilité de créer des objets de même nom dans différents schémas complique l’écriture d’une requête qui fait référence précisément aux mêmes objets à chaque fois. Elle ouvre également la possibilité aux utilisateurs de modifier le comportement des requêtes des autres utilisateurs, par malveillance ou par accident. En raison de la prévalence des noms non qualifiés dans les requêtes et de leur utilisation dans les internes de PostgreSQL, l’ajout d’un schéma à search_pathe confie effectivement tous les utilisateurs ayant le privilège CREATE sur ce schéma. Lorsque vous exécutez une requête ordinaire, un utilisateur malveillant capable de créer des objets dans un schéma de votre chemin de recherche peut prendre le contrôle et exécuter des fonctions SQL arbitraires comme si vous les aviez exécutées.

Le premier schéma nommé dans le chemin de recherche est appelé le schéma courant. En plus d’être le premier schéma recherché, c’est également le schéma dans lequel les nouvelles tables seront créées si la commande CREATE TABLE ne spécifie pas de nom de schéma.

Pour afficher le chemin de recherche courant, utilisez la commande suivante :

SHOW search_path;

Dans la configuration par défaut, cela renvoie :

 search_path-------------- "$user",public

Le premier élément spécifie qu’un schéma avec le même nom que l’utilisateur courant doit être recherché. Si un tel schéma n’existe pas, l’entrée est ignorée. Le deuxième élément fait référence au schéma public que nous avons déjà vu.

Le premier schéma du chemin de recherche qui existe est l’emplacement par défaut pour la création de nouveaux objets. C’est la raison pour laquelle, par défaut, les objets sont créés dans le schéma public. Lorsque les objets sont référencés dans tout autre contexte sans qualification de schéma (modification de table, modification de données ou commandes de requête), le chemin de recherche est parcouru jusqu’à ce qu’un objet correspondant soit trouvé. Par conséquent, dans la configuration par défaut, tout accès non qualifié ne peut à nouveau se référer qu’au schéma public.

Pour placer notre nouveau schéma dans le chemin, nous utilisons :

SET search_path TO myschema,public;

(Nous omettons le $user ici car nous n’en avons pas un besoin immédiat.) Et ensuite, nous pouvons accéder à la table sans qualification de schéma:

DROP TABLE mytable;

De plus, puisque myschema est le premier élément du chemin, les nouveaux objets seraient par défaut créés init.

Nous aurions aussi pu écrire:

SET search_path TO myschema;

Alors nous n’avons plus accès au schéma public sans qualification explicite. Il n’y a rien de spécial au sujet du schéma public, sauf qu’il existe par défaut. Il peut être abandonné,aussi.

Voir aussi la Section 9.25 pour d’autres façons de manipuler le chemin de recherche du schéma.

Le chemin de recherche fonctionne de la même manière pour les noms de types de données, les noms de fonctions et les noms d’opérateurs que pour les noms de tables. Les noms de types de données et de fonctions peuvent être qualifiés exactement de la même manière que les noms de tables. Si vous devez écrire un nom d’opérateur qualifié dans une expression, il existe une disposition spéciale : vous devez écrire

OPERATOR(schema.operator)

Ceci est nécessaire pour éviter toute ambiguïté syntaxique. Un exemple est :

SELECT 3 OPERATOR(pg_catalog.+) 4;

Dans la pratique, on s’appuie généralement sur le chemin de recherche des opérateurs,afin de ne pas avoir à écrire quelque chose d’aussi laid que cela.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.