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 superutilisateur, tous les rôles sont utilisables).
Les modificateurs SESSION et LOCAL agissent de la même façon que pour la commande SET(7).
Les formes NONE et RESET réinitialisent l'identifiant de l'utilisateur à la valeur de session. Ces formes peuvent être exécutées 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 INHERITS, 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 NOINHERITS, 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 superutilisateur via SET ROLE, il perd les droits superutilisateur.
SET ROLE a des effets comparables à SET SESSION AUTHORIZATION(7) 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(7) ; 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 ("nom_role") 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 SESSION et LOCAL sont des extensions PostgreSQL™ tout comme la syntaxe RESET.