Poupées gigognes
Un schéma (SCHEMA) appartient à une base de données (DATABASE). Une table (TABLE) ou une vue (VIEW) etc. appartiennent à un schéma (SCHEMA). Une table est donc désignée de manière complète sous la forme DATABASE.SCHEMA.TABLE. Cependant, avec PostgreSQL, vous vous connectez à une DATABASE et ne pouvez ensuite accéder quaux éléments de cette DATABASE. Cela signifie que, même sil est possible dutiliser DATABASE.SCHEMA.ELEMENT, il est plus courant de rencontrer SCHEMA.ELEMENT puisque DATABASE est nécessairement la base courante.
Les utilisateurs dOracle Database ne créent pas de SCHEMAS. La création dun utilisateur crée implicitement un schéma portant le nom de cet utilisateur. Il existe pourtant sous Oracle Database une syntaxe CREATE SCHEMA largement méconnue. Mais il est bien précisé dans la documentation quil sagit simplement de regrouper dans une transaction une suite de créations de tables et dattributions de privilèges objet sur ces tables. Sans CREATE SCHEMA, Oracle Database validerait la transaction après chaque création de table et attribution de privilège. Voir la documentation Oracle si vous voulez des précisions.
PostgreSQL permet de créer explicitement des schémas. Le paramètre de niveau session SEARCH_PATH précise lordre de recherche dans les schémas si vous désignez un élément par ELEMENT et non par SCHEMA.ELEMENT. Lordre de recherche par défaut est "$user", public. Cela signifie quen labsence de schéma portant son nom un utilisateur créera ses tables etc. dans un schéma PUBLIC si vous ne précisez pas SCHEMA.ELEMENT. PostgreSQL va par ailleurs plus loin que la norme SQL en permettant à un utilisateur de créer un élément dans un schéma ne lui appartenant pas tout en conservant la propriété de cet élément. Cela peut donner des situations compliquées comme dans cet exemple :
Assez trompeur non ? Lutilisateur postgres, un superuser, a créé une table dans le schéma de toto. Toto ne pouvait pas lire la table. Mais il a pu détruire le schéma toto et donc la table appartenant à postgres. Remarque de Vincent et Julien : ce serait comme planter un pied de tomates dans le jardin de son voisin. Le voisin pourrait arracher le pied de tomates mais pas récolter les tomates si vous ne lui en donnez pas le droit.
Ce nest pas parce que quelque chose est possible quil est recommandé de le faire. Je conseille, spécialement si vous êtes habitués à Oracle Database, de vous en tenir aux principes suivants :
Bref, à moins davoir une excellente raison, privilégiez la simplicité. Cela vous évitera les confusions et conflits entre voisins !
Mise à jour : 27/03/2016