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.