CREATE ROLE — Définir un nouveau rôle de base de données
CREATE ROLEnom[ [ WITH ]option[ ... ] ] oùoptionpeut être : SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | INHERIT | NOINHERIT | LOGIN | NOLOGIN | REPLICATION | NOREPLICATION | BYPASSRLS | NOBYPASSRLS | CONNECTION LIMITlimite_connexion| [ ENCRYPTED ] PASSWORD 'motdepasse' | PASSWORD NULL | VALID UNTIL 'heuredate' | IN ROLEnom_role[, ...] | ROLEnom_role[, ...] | ADMINnom_role[, ...] | SYSIDuid
CREATE ROLE ajoute un nouveau rôle dans une instance
PostgreSQL. Un rôle est une entité qui peut
posséder des objets de la base de données et avoir des droits sur la base
et ses objets. Il peut être considéré comme un « utilisateur »,
un « groupe » ou les deux suivant la façon dont il est utilisé.
Chapitre 21 et Chapitre 20
donnent de plus amples informations sur la gestion des utilisateurs et
l'authentification. Il est nécessaire de posséder le droit
CREATEROLE ou d'être superutilisateur pour utiliser
cette commande.
Les rôles sont définis au niveau de l'instance, et sont donc disponibles dans toutes les bases de l'instance.
Lors de la création d'un rôle, il est possible d'affecter immédiatement
le nouveau rôle à un rôle existant, et aussi d'affecter des rôles
existants au nouveau rôle. Les règles pour lesquelles les options
d'appartenance de rôle sont activées sont décrites ci-dessous dans les
clauses IN ROLE, ROLE et
ADMIN. La commande GRANT a
un contrôle plus fin lors de l'ajout de membres et la possibilité de
modifier ces options une fois le rôle créé.
nomLe nom du nouveau rôle.
SUPERUSERNOSUPERUSER
Ces clauses définissent si le nouveau rôle est un
« superutilisateur » et peut ainsi outrepasser les droits
d'accès à la base de données. Le statut de superutilisateur est
dangereux et ne doit être utilisé qu'en cas d'absolue nécessité. Seul un
superutilisateur peut créer un superutilisateur.
NOSUPERUSER est la valeur par défaut.
CREATEDBNOCREATEDB
Ces clauses définissent la capacité d'un rôle à créer des bases de
données. Si CREATEDB est indiqué, le rôle en cours
de définition sera autorisé à créer de nouvelles bases de données.
Indiquer NOCREATEDB empêchera un rôle de créer des
bases de données. Si non spécifié, NOCREATEDB est la
valeur par défaut. Seuls les rôles superutilisateur et les rôles avec
CREATEDB peuvent spécifier CREATEDB.
CREATEROLENOCREATEROLE
Ces clauses précisent le droit de création, modification, suppression,
ajout de commentaire, et modification du label de sécurité.
Voir création de rôle pour plus de détails sur les
possibilités offertes par ce droit.
NOCREATEROLE est la valeur
par défaut.
INHERITNOINHERIT
Ceci affecte le statut d'héritage des membres quand ce rôle est ajouté
comme membre d'un autre rôle, à la fois dans cette commande et dans les
commandes futures. En particulier, cela contrôle le statut d'héritage des
membres ajoutés avec cette commande en utilisant la clause IN
ROLE, et dans les commandes ultérieures en utilisant la clause
ROLE. Cela peut aussi être utilisé en tant que statut
d'héritage par défaut lors de l'ajout de ce rôle comme membre en utilisant
la commande GRANT. Sans indication,
INHERIT est le défaut.
Avant PostgreSQL 16, l'héritage était un attribut au niveau rôle, qui contrôlait toutes les vérifications d'appartenance à l'exécution pour ce rôle.
LOGINNOLOGIN
Ces clauses précisent si un rôle est autorisé à se connecter,
c'est-à-dire si le rôle peut être donné comme nom pour l'autorisation
initiale de session à la connexion du client. Un rôle ayant l'attribut
LOGIN peut être vu comme un utilisateur. Les rôles
qui ne disposent pas de cet attribut sont utiles pour gérer les droits
de la base de données mais ne sont pas des utilisateurs au sens habituel
du mot. NOLOGIN est la valeur par défaut, sauf
lorsque CREATE ROLE est appelé à travers la commande
CREATE USER.
REPLICATIONNOREPLICATION
Ces clauses déterminent si un rôle est un rôle de réplication. Un rôle
doit avoir cet attribut (ou être un superutilisateur) pour être capable
de se connecter à un serveur en mode réplication (physique ou logique)
et pour être capable de créer ou supprimer des slots de réplication.
Seuls les rôles superutilisateurs ou les rôles avec l'attribut
REPLICATION peuvent spécifier
REPLICATION.
BYPASSRLSNOBYPASSRLS
Ces clauses déterminent si un rôle contourne toute politique de sécurité
au niveau ligne (RLS). NOBYPASSRLS est la valeur par
défaut.
Seuls les rôles superutilisateurs ou les rôles avec l'attribut
BYPASSRLS peuvent spécifier
BYPASSRLS.
Notez que l'outil pg_dump configure
row_security à OFF par défaut pour
s'assurer que tout le contenu d'une table est sauvegardé. Si
l'utilisateur exécutant pg_dump n'a pas les
droits appropriés, une erreur est renvoyée. Néanmoins, les
superutilisateurs et le propriétaire de la table sauvegardée contournent
toujours RLS.
CONNECTION LIMIT limiteconnexionLe nombre maximum de connexions concurrentes possibles pour le rôle, s'il possède le droit de connexion. -1 (valeur par défaut) signifie qu'il n'y a pas de limite. Il est à noter que seules les connexions normales sont soumises à cette limite. Les transactions préparées et les connexions des processus worker n'y sont pas soumis.
ENCRYPTED ] PASSWORD motdepasse | PASSWORD NULL
Le mot de passe du rôle. Il n'est utile que pour les rôles ayant
l'attribut LOGIN, mais il est possible d'en définir
un pour les rôles qui ne l'ont pas. Cette option peut être omise si
l'authentification par mot de passe n'est pas envisagée. Si aucun mot de
passe n'est spécifié, le mot de passe est NULL et l'authentification par
mot de passe échouera toujours pour cet utilisateur. Un mot de passe
NULL peut aussi être indiqué explicitement avec PASSWORD
NULL.
Indiquer un mot de passe vide configurera aussi le mot de passe à NULL, ce qui n'était pas le cas avant la version 10 de PostgreSQL. Dans les versions précédentes, une chaîne vide pouvait être utilisée ou non, suivant la méthode d'authentification et la version exacte, alors que libpq refuserait de l'utiliser dans tous les cas. Pour lever l'ambiguité, une chaîne vide doit être évité.
Le mot de passe est toujours stocké chiffré dans les catalogues système.
Le mot clé ENCRYPTED n'a aucun effet, mais est accepté
pour compatibilité descendante. La méthode de chiffrement est déterminée
par le paramètre de configuration password_encryption.
Si le texte du mot de passe présenté est chiffré avec un format MD5 ou
SCRAM, alors il sera stocké tel quel sans prendre en compte
password_encryption (puisque le système ne peut pas
déchiffrer la chaîne du mot de passe spécifiée, pour le chiffrer dans un
format différent). Cela permet de recharger des mots de passe chiffrés
durant une opération de sauvegarde / restauration.
L'utilisation de mots de passe hachés avec MD5 est considérée comme obsolète et sera supprimée d'une version future de PostgreSQL. Référez-vous à Section 20.5 pour les détails sur la migration vers un autre type de chiffrement de mot de passe.
VALID UNTIL 'dateheure'Cette clause configure la date et l'heure de fin de validité du mot de passe. Sans précision, le mot de passe est indéfiniment valide.
IN ROLE nom_role
La clause IN ROLE fait que le nouveau rôle se voit
ajouté automatiquement comme membre des rôles existants cités.
La nouvelle appartenance aura l'option SET
activée et l'option ADMIN désactivée. L'option
INHERIT sera activée sauf si l'option
NOINHERIT est indiquée.
ROLE nom_role
La clause ROLE fait que les rôles existants cités sont
ajoutés automatiquement comme membre du nouveau rôle, avec l'option
SET activée. Dans les faits, ceci transforme le nouveau
rôle en un « groupe ». Les rôles nommés dans cette clause avec
l'attribut INHERIT aura l'option
INHERIT activée dans la nouvelle appartenance. Les
nouveaux membres auront l'option ADMIN désactivée.
ADMIN nom_role
Cette clause a le même effet que la clause ROLE, à la
différence que les rôles nommés sont ajoutés comme membres du nouveau rôle
avec l'option ADMIN activée. Cela leur confère le droit
de promouvoir à d'autres rôles l'appartenance à celui-ci.
SYSID uid
La clause SYSID est ignorée, mais toujours acceptée
pour des raisons de compatibilité.
ALTER ROLE
est utilisé pour modifier les attributs d'un rôle, et DROP ROLE pour supprimer
un rôle. Tous
les attributs positionnés par CREATE ROLE peuvent être
modifiés par la suite à l'aide de commandes ALTER ROLE.
Il est préférable d'utiliser GRANT
et REVOKE.
pour ajouter et supprimer des membres de rôles utilisés
comme groupe.
La clause VALID UNTIL définit les date et heure
d'expiration du mot de passe uniquement, pas du rôle. En particulier, les
date et heure d'expiration ne sont pas vérifiées lors de connexions à
l'aide de méthodes d'authentification qui n'utilisent pas les mots de
passe.
Les attributs de rôle définis ici ne sont pas héritables, autrement dit
être membre d'un rôle. Par exemple, CREATEDB n'autorisera
pas le membre à créer de nouvelles bases y compris si le membre a l'option
INHERIT. Bien sûr, si l'appartenance a l'option
SET, le rôle membre serait capable d'utiliser
SET ROLE vers le
rôle qui a CREATEDB et pourrait ainsi créer une nouvelle base.
Les droits d'appartenance créés par les clauses
IN ROLE, ROLE et ADMIN
ont le rôle exécutant cette commande comme donneur.
L'attribut INHERIT est la valeur par défaut pour des
raisons de compatibilité descendante : dans les précédentes versions
de PostgreSQL, les utilisateurs avaient toujours
accès à tous les droits des groupes dont ils étaient membres. Toutefois,
NOINHERIT est plus respectueux de la sémantique
spécifiée dans le standard SQL.
PostgreSQL inclut un programme, createuser, qui possède les mêmes fonctionnalités que
CREATE ROLE (en fait, il appelle cette commande) et peut
être lancé à partir du shell.
L'option CONNECTION LIMIT n'est vérifiée
qu'approximativement. Si deux nouvelles sessions sont lancées à peu près
simultanément alors qu'il ne reste qu'un seule possibilité de connexion
pour le rôle, il est possible que les deux échouent. De plus, la limite
n'est jamais vérifiée pour les superutilisateurs.
Faites attention lorsque vous donnez un mot de passe non chiffré avec cette
commande. Le mot de passe sera transmis en clair au serveur. Ce dernier
pourrait être tracé dans l'historique des commandes du client ou dans les
traces du serveur. Néanmoins, la commande createuser
transmet le mot de passe chiffré. De plus, psql
contient une commande \password que vous pouvez utiliser
pour modifier en toute sécurité votre mot de passe.
Créer un rôle qui peut se connecter mais sans lui donner de mot de passe :
CREATE ROLE jonathan LOGIN;
Créer un rôle avec un mot de passe :
CREATE USER davide WITH PASSWORD 'jw8s0F4';
(CREATE USER est identique à CREATE ROLE mais
implique l'attribut LOGIN.)
Créer un rôle avec un mot de passe valide jusqu'à fin 2006. Une seconde après le passage à 2007, le mot de passe n'est plus valide.
CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2007-01-01';
Créer un rôle qui peut créer des bases de données et gérer des rôles :
CREATE ROLE admin WITH CREATEDB CREATEROLE;
L'instruction CREATE ROLE est définie dans le standard
SQL. Ce dernier n'impose que la syntaxe
CREATE ROLEnom[ WITH ADMINnom_role]
La possibilité d'avoir plusieurs superutilisateurs initiaux et toutes les
autres options de CREATE ROLE sont des extensions
PostgreSQL.
Le standard SQL définit les concepts d'utilisateurs et de rôles mais les considère comme des concepts distincts et laisse la spécification des commandes de définition des utilisateurs à l'implémentation de chaque moteur de bases de données. PostgreSQL a pris le parti d'unifier les utilisateurs et les rôles au sein d'une même entité. Ainsi, les rôles ont plus d'attributs optionnels que dans le standard.
Le comportement spécifié par le standard SQL peut être approché en créant des
utilisateurs du standard SQL comme des rôles
PostgreSQL avec l'option
NOINHERIT, et les rôles du standard SQL comme des rôles
PostgreSQL avec l'option
INHERIT.
La clause USER a le même comportement que
ROLE mais est obsolète :
USER nom_role [, ...]
La clause IN GROUP a le même comportement que
IN ROLE mais est obsolète :
IN GROUP nom_role [, ...]