SET ROLE — initialise l'identifiant utilisateur courant de la session en cours
SET [ SESSION | LOCAL ] ROLE nom_rôle
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
Cette commande positionne l'identifiant utilisateur courant suivant la
session SQL en cours à nom_rôle
. Le nom du rôle peut être
un identifiant ou une chaîne littérale.
Après SET ROLE
, la vérification des droits sur les commandes SQL
est identique à ce qu'elle serait si le rôle nommé s'était lui-même connecté.
Il est obligatoire que l'utilisateur de la session courante soit membre
du rôle nom_rôle
(si l'utilisateur de la session est super-utilisateur, tous les rôles sont
utilisables).
Les modificateurs SESSION
et LOCAL
agissent de la même
façon que pour la commande SET
.
SET ROLE NONE
initialise l'identifiant utilisateur
courant avec l'identifiant de la session en cours, tel qu'il est renvoyé
par session_user
. RESET ROLE
initialise l'identifiant de l'utilisateur courant avec le paramètre à la
connexion indiqué par les options en
ligne de commande, ALTER
ROLE
ou ALTER
DATABASE
, si de tels paramètres existent. Sinon,
RESET ROLE
initialise l'identifiant utilisateur courant
avec l'identifiant utilisateur courant. Ces formats peuvent être exécutés
par tout utilisateur.
L'utilisation de cette commande permet d'étendre ou de restreindre les
privilèges d'un utilisateur. Si le rôle de l'utilisateur de la
session comprend l'attribut INHERIT
, alors il
acquiert automatiquement les droits de chaque rôle qu'il peut prendre
par la commande SET ROLE
; dans
ce cas, SET ROLE
supprime tous les droits affectés
directement à l'utilisateur de la session et les autres droits des rôles
dont il est membre, ne lui laissant que les droits disponibles sur le rôle
nommé. A l'opposé, si le rôle session de l'utilisateur dispose de
l'attribut NOINHERIT
, SET ROLE
supprime les droits
affectés directement à l'utilisateur session et les remplace par les
privilèges du rôle nommé.
En particulier, quand un utilisateur choisit un rôle autre que
super-utilisateur via SET ROLE
, il perd les droits
super-utilisateur.
SET ROLE
a des effets comparables à
SET SESSION
AUTHORIZATION
mais la vérification des
droits diffère. De plus, SET SESSION AUTHORIZATION
détermine les rôles autorisés
dans les commandes SET ROLE
ultérieures alors que
SET ROLE
ne modifie pas les rôles accessibles par
un futur SET ROLE
.
SET ROLE
ne traite pas les variables de session
indiqué par les paramètres du rôle (et configurés avec ALTER ROLE
; cela ne
survient qu'à la connexion.
SET ROLE
ne peut pas être utilisé dans une
fonction SECURITY DEFINER
.
SELECT SESSION_USER, CURRENT_USER; session_user | current_user --------------+-------------- peter | peter SET ROLE 'paul'; SELECT SESSION_USER, CURRENT_USER; session_user | current_user --------------+-------------- peter | paul
PostgreSQL autorise la syntaxe identifiant
("
) alors que le SQL
standard impose une chaîne littérale pour le nom du rôle.
SQL n'autorise pas cette commande lors d'une transaction ;
PostgreSQL n'est pas aussi restrictif,
rien ne justifie cette interdiction. Les modificateurs
nom_role
"SESSION
et LOCAL
sont des extensions
PostgreSQL tout comme la syntaxe RESET
.