CREATE ROLE — Définir un nouveau rôle de base de données
CREATE ROLEnom
[ [ WITH ]option
[ ... ] ] oùoption
peut ê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
[, ...] | IN GROUPnom_role
[, ...] | ROLEnom_role
[, ...] | ADMINnom_role
[, ...] | USERnom_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 22 et Chapitre 21
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 super-utilisateur 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.
nom
Le nom du nouveau rôle.
SUPERUSER
NOSUPERUSER
Ces clauses définissent si le nouveau rôle est un
« super-utilisateur » et peut ainsi outrepasser les droits
d'accès à la base de données. Le statut de super-utilisateur est
dangereux et ne doit être utilisé qu'en cas d'absolue nécessité. Seul un
super-utilisateur peut créer un super-utilisateur.
NOSUPERUSER
est la valeur par défaut.
CREATEDB
NOCREATEDB
Ces clauses précisent le droit de création de bases de données. Si
CREATEDB
est spécifié, l'autorisation est donnée au
rôle. NOCREATEDB
, valeur par défaut, produit l'effet
inverse.
CREATEROLE
NOCREATEROLE
Ces clauses précisent le droit de création, modification, suppression,
ajout de commentaire, modification du label de sécurité, d'ajout et de
suppression de membres pour les rôles.
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.
INHERIT
NOINHERIT
Ces clauses précisent si un rôle « hérite » des droits d'un
rôle dont il est membre. Un rôle qui possède l'attribut
INHERIT
peut automatiquement utiliser tout droit
détenu par un rôle dont il est membre direct ou indirect. Sans
INHERIT
, l'appartenance à un autre rôle lui confère
uniquement la possibilité d'utiliser SET ROLE
pour
acquérir les droits de l'autre rôle ; ils ne sont disponibles
qu'après cela. INHERIT
est la valeur par défaut.
LOGIN
NOLOGIN
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
.
REPLICATION
NOREPLICATION
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 super-utilisateur) 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.
Vous devez être super-utilisateur pour créer un nouveau rôle ayant
l'attribut REPLICATION
.
BYPASSRLS
NOBYPASSRLS
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.
Vous devez être super-utilisateur pour créer un nouveau rôle ayant
l'attribut 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
super-utilisateurs et le propriétaire de la table sauvegardée contournent
toujours RLS.
CONNECTION LIMIT
limiteconnexion
Le 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.
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
Cette clause liste les rôles dont le nouveau rôle est membre. Il
n'existe pas d'option pour ajouter le nouveau rôle en tant que
super-utilisateur ; cela se fait à l'aide d'une commande
GRANT
séparée.
IN GROUP
nom_role
IN GROUP
est un équivalent obsolète de IN
ROLE
.
ROLE
nom_role
Cette clause liste les rôles membres du nouveau rôle. Le nouveau rôle devient ainsi un « groupe ».
ADMIN
nom_role
Cette clause est équivalente à la clause ROLE
, à la
différence que les rôles nommés sont ajoutés au nouveau rôle avec
l'option WITH ADMIN OPTION
. Cela leur confère le
droit de promouvoir à d'autres rôles l'appartenance à celui-ci.
USER
nom_role
USER
est un équivalent obsolète de
ROLE
.
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.
L'attribut INHERIT
gouverne l'héritage des droits
conférables (c'est-à-dire les droits d'accès aux objets de la base de
données et les appartenances aux rôles). Il ne s'applique pas aux attributs
de rôle configurés par CREATE ROLE
et ALTER
ROLE
. Par exemple, être membre d'un rôle disposant du droit
CREATEDB
ne confère pas automatiquement le droit de
création de bases de données, même avec INHERIT
positionné ; il est nécessaire d'acquérir ce rôle via SET ROLE
avant de créer
une base de données.
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.
L'attribut CREATEROLE
impose quelques précautions. Il
n'y a pas de concept d'héritage des droits pour un tel rôle. Cela signifie
qu'un rôle qui ne possède pas un droit spécifique, mais est autorisé à
créer d'autres rôles, peut aisément créer un rôle possédant des droits
différents des siens (sauf en ce qui concerne la création des rôles
super-utilisateurs). Par exemple, si le rôle « u1 » a le droit
CREATEROLE
mais pas le droit
CREATEDB
, il peut toujours créer un rôle possédant le
droit CREATEDB
. Il est de ce fait important de
considérer les rôles possédant l'attribut CREATEROLE
comme des super-utilisateurs en puissance.
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 super-utilisateurs.
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 super-utilisateurs 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 donnant
aux utilisateurs l'attribut NOINHERIT
et aux rôles
l'attribut INHERIT
.