SET ROLE#

SET ROLE

SET ROLE

SET ROLE — установить текущий идентификатор пользователя текущей сессии

Синтаксис

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

Описание

Эта команда устанавливает текущий идентификатор пользователя текущей SQL-сессии в role_name. Имя роли может быть записано как идентификатор или строковый литерал. После SET ROLE проверка разрешений для SQL-команд выполняется так, как если бы указанная роль была той, которая изначально вошла в систему. Обратите внимание, что SET ROLE и SET SESSION AUTHORIZATION являются исключениями; проверки разрешений для них продолжают использовать текущего пользователя сессии и начального пользователя сессии (соответственно аутентифицированного пользователя).

Текущий пользователь сессии должен иметь опцию SET для указанного role_name, либо напрямую, либо косвенно через цепочку членств с опцией SET. (Если пользователь сессии является суперпользователем, любая роль может быть выбрана.)

Модификаторы SESSION и LOCAL действуют так же, как и для обычной команды SET.

SET ROLE NONE устанавливает идентификатор текущего пользователя в идентификатор текущего пользователя сессии, возвращаемый функцией session_user. RESET ROLE устанавливает идентификатор текущего пользователя в значение, указанное в настройках подключения, заданных в параметрах командной строки, ALTER ROLE или ALTER DATABASE, если такие настройки существуют. В противном случае RESET ROLE устанавливает идентификатор текущего пользователя в идентификатор текущего пользователя сессии. Эти формы могут быть выполнены любым пользователем.

Примечания

Используя эту команду, можно либо добавить привилегии, либо ограничить свои привилегии. Если роль пользователя сессии была предоставлена членством WITH INHERIT TRUE, она автоматически получает все привилегии каждой такой роли. В этом случае, SET ROLE фактически отменяет все привилегии, кроме тех, которые целевая роль непосредственно обладает или наследует. С другой стороны, если роль пользователя сессии была предоставлена членством WITH INHERIT FALSE, привилегии предоставленных ролей не могут быть доступны по умолчанию. Однако, если роль была предоставлена с WITH SET TRUE, пользователь сессии может использовать SET ROLE для отмены привилегий, назначенных непосредственно пользователю сессии, и вместо этого получить привилегии, доступные указанной роли. Если роль была предоставлена с WITH INHERIT FALSE, SET FALSE, то привилегии этой роли не могут быть использованы ни с SET ROLE, ни без него.

SET ROLE имеет эффекты, сравнимые с SET SESSION AUTHORIZATION, но проверки привилегий, вовлеченные в процесс, существенно отличаются. Кроме того, SET SESSION AUTHORIZATION определяет, какие роли допустимы для последующих команд SET ROLE, в то время как изменение ролей с помощью SET ROLE не изменяет набор ролей, разрешенных для последующего SET ROLE.

SET ROLE не обрабатывает переменные сессии, как указано в настройках ALTER ROLE роли; это происходит только во время входа в систему.

Внутри функции SECURITY DEFINER нельзя использовать команду SET ROLE.

Примеры

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

Совместимость

Tantor BE позволяет использовать синтаксис идентификаторов ("rolename"), в то время как стандарт SQL требует, чтобы имя роли было записано как строковый литерал. SQL не позволяет выполнять эту команду во время транзакции; Tantor BE не делает этого ограничения, потому что нет причины для этого. Модификаторы SESSION и LOCAL являются расширением Tantor BE, также как и синтаксис RESET.