Une base de données PostgreSQL peut être découpée en plusieurs schémas pour isoler les données selon des domaines différents par exemple recette/production ou clientX/clientY/clientZ.

Si on liste les tables article contenues dans la base tutorial, on voit les deux schémas présents : production et recette

tutorial=# SELECT schemaname,tablename FROM pg_catalog.pg_tables WHERE tablename = 'article';
 schemaname | tablename
------------+-----------
 production | article
 recette    | article
(2 rows)

Si on ne cite pas le schéma lors d'un select sur la table article, on obtient l'erreur suivante :

tutorial=# select * from article;
ERROR:  relation "article" does not exist
LINE 1: select * from article;

Pour lister le contenu de la table article appartenant au schéma production, il est nécessaire de préfixer la table du nom de schéma (ici production) :

tutorial=# select * from production.article;
 article_id |   article_name   | article_price |                 article_option
------------+------------------+---------------+-------------------------------------------------
       1001 | Clavier QUERTY   |         34.30 | {"marque":"KBTech"}
       1002 | Clavier AZERTY   |         34.30 | {"marque":"KBTech"}
       1003 | Souris à fil     |          13.0 | {"marque":"MouseIN","longueur du fil en cm":80}
       1004 | Souris Bluetooth |         35.60 | {"marque":"MouseIN"}
       1005 | Ecran 22pouces   |        130.00 | {"marque":"VGTech"}
       1006 | Ecran 24pouces   |        160.00 | {"marque":"VGTech"}
(6 rows)

Ceci est normal, parce que PostgreSQL recherche les tables selon un chemin spécifique indiqué dans le paramètre search_path:

tutorial=# SHOW search_path;
   search_path
-----------------
 "$user", public
(1 row)

Par défaut, la table sera recherchée avec les préfixes suivants : dans le schéma du nom de l'utilisateur ($user), puis dans le schéma public.

Cette information peut être soit modifiée dans le fichier postgresql.conf de votre installation en modifiant la ligne suivante :

search_path = '"$user",public'		# schema names

Par exemple, en indiquant le schéma de travail principal, puis éventuellement le schéma public :

search_path = 'production,public'		# schema names

Mais on peut aussi modifier ce chemin d'accès juste le temps de la session, en modifiant la valeur du paramètre search_path dans la session :

tutorial=# set search_path = production;
SET

Dans les deux cas, un select sur la table article sera effectué dans le schéma 'production' :

tutorial=# select * from article;
 article_id |   article_name   | article_price |                 article_option
------------+------------------+---------------+-------------------------------------------------
       1001 | Clavier QUERTY   |         34.30 | {"marque":"KBTech"}
       1002 | Clavier AZERTY   |         34.30 | {"marque":"KBTech"}
       1003 | Souris à fil     |          13.0 | {"marque":"MouseIN","longueur du fil en cm":80}
       1004 | Souris Bluetooth |         35.60 | {"marque":"MouseIN"}
       1005 | Ecran 22pouces   |        130.00 | {"marque":"VGTech"}
       1006 | Ecran 24pouces   |        160.00 | {"marque":"VGTech"}
(6 rows)