SET ROLE

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

Синтаксис

SET [ SESSION | LOCAL ] ROLE имя_роли
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE

Описание

Эта команда задает идентификатор текущего пользователя для активного сеанса SQL как имя_роли. Имя роли может быть записано как идентификатор или строковая константа. После SET ROLE проверка права доступа для команд SQL выполняется так, как если бы сеанс изначально был установлен с этим именем роли.

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

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

Формы NONE и RESET сбрасывают идентификатор текущего пользователя, в результате чего активным становится идентификатор пользователя активного сеанса. Эти формы может выполнить любой пользователь.

Примечания

С помощью этой команды можно как добавить права, так и ограничить их. Если роль пользователя сеанса имеет атрибут INHERIT, она автоматически получает права всех ролей, на которые может переключиться с помощью SET ROLE; в этом случае SET ROLE по сути удаляет все права, назначенные непосредственно пользователю сеанса и другим ролям, членом которых он является, оставляя только права, доступные для указанной роли. С другой стороны, если роль пользователя сеанса имеет атрибут NOINHERIT, то SET ROLE удаляет права, назначенные непосредственно пользователю сеанса, и вместо этого назначает права, доступные для указанной роли.

В частности, когда суперпользователь переключается через SET ROLE на роль, не являющуюся суперпользователем, он теряет свои права суперпользователя.

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

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

Команду SET ROLE нельзя использовать в пределах функций с характеристикой 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

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

QHB допускает синтаксис идентификаторов (параметр «имя_роли»), в то время как стандарт SQL требует, чтобы имя роли было записано как строковая константа. Стандарт SQL не разрешает выполнять эту команду во время транзакции; в QHB такого ограничения нет, потому что для него нет никаких причин. Указания SESSION и LOCAL являются расширением QHB, так же, как и синтаксис RESET.

См. также

SET SESSION AUTHORIZATION