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.