SET ROLE — establece el identificador de usuario actual de la sesión actual
SET [ SESSION | LOCAL ] ROLE role_name
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
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.
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.
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 permite la sintaxis de identificador
("), 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 rolename"SESSION y LOCAL son una
extensión de PostgreSQL, al igual que la sintaxis RESET.