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_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 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.