SET ROLE

SET ROLE — establece el identificador de usuario actual de la sesión actual

Synopsis

SET [ SESSION | LOCAL ] ROLE role_name
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE

Descripción

Este comando establece el identificador de usuario actual de la sesión SQL actual a role_name. El nombre del rol se puede escribir como un identificador o como un literal de cadena. Después de SET ROLE, la comprobación de permisos para los comandos SQL se realiza como si el rol especificado fuera el que había iniciado sesión originalmente. Ten en cuenta que SET ROLE y SET SESSION AUTHORIZATION son excepciones; las comprobaciones de permisos para estos continúan utilizando el usuario de la sesión actual y el usuario inicial de la sesión (el usuario autenticado), respectivamente.

El usuario de la sesión actual debe tener la opción SET para el role_name especificado, ya sea de forma directa o indirecta a través de una cadena de membresías con la opción SET. (Si el usuario de la sesión es un superusuario, se puede seleccionar cualquier rol).

Los modificadores SESSION y LOCAL actúan de la misma manera que para el comando regular SET.

SET ROLE NONE establece el identificador de usuario actual al identificador del usuario de la sesión actual, según lo devuelto por session_user. RESET ROLE establece el identificador de usuario actual a la configuración de tiempo de conexión especificada por las opciones de línea de comandos, ALTER ROLE o ALTER DATABASE, si existen tales configuraciones. De lo contrario, RESET ROLE establece el identificador de usuario actual al identificador del usuario de la sesión actual. Estas formas pueden ser ejecutadas por cualquier usuario.

Notas

Al usar este comando, es posible agregar privilegios o restringir los propios privilegios. Si al rol del usuario de la sesión se le han otorgado membresías WITH INHERIT TRUE, tiene automáticamente todos los privilegios de cada uno de esos roles. En este caso, SET ROLE elimina efectivamente todos los privilegios excepto aquellos que el rol de destino posee o hereda directamente. Por otro lado, si al rol del usuario de la sesión se le han otorgado membresías WITH INHERIT FALSE, los privilegios de los roles otorgados no se pueden acceder de forma predeterminada. Sin embargo, si al rol se le otorgó WITH SET TRUE, el usuario de la sesión puede usar SET ROLE para descartar los privilegios asignados directamente al usuario de la sesión y, en su lugar, adquirir los privilegios disponibles para el rol nombrado. Si el rol se otorgó WITH INHERIT FALSE, SET FALSE, entonces los privilegios de ese rol no se pueden ejercer ni con ni sin SET ROLE.

SET ROLE tiene efectos comparables a SET SESSION AUTHORIZATION, pero las comprobaciones de privilegios involucradas son bastante diferentes. Además, SET SESSION AUTHORIZATION determina qué roles están permitidos para comandos SET ROLE posteriores, mientras que cambiar de rol con SET ROLE no cambia el conjunto de roles permitidos para un SET ROLE posterior.

SET ROLE no procesa las variables de sesión según lo especificado por la configuración ALTER ROLE del rol; esto solo ocurre durante el inicio de sesión.

SET ROLE no se puede utilizar dentro de una función SECURITY DEFINER.

Ejemplos

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

Compatibilidad

PostgreSQL permite la sintaxis de identificador ("rolename"), mientras que el estándar SQL requiere que el nombre del rol se escriba como un literal de cadena. SQL no permite este comando durante una transacción; PostgreSQL no hace esta restricción porque no hay razón para hacerlo. Los modificadores SESSION y LOCAL son una extensión de PostgreSQL, al igual que la sintaxis RESET.

Véase también

SET SESSION AUTHORIZATION