SET ROLE

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


Синтаксис

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

Описание

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

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

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

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


Примечания

С помощью этой команды можно как добавить права, так и ограничить их. Если роль пользователя сеанса имеет атрибут 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, как и синтаксис RESET, являются расширением QHB.


См. также

SET SESSION AUTHORIZATION