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
. Если же такое значение не задано, в качестве идентификатора текущего пользователя так же устанавливается идентификатор текущего пользователя сеанса. Эти формы могут выполняться любыми пользователями.
Примечания
С помощью этой команды можно как добавить права, так и ограничить их. Если роль пользователя сеанса имеет атрибут 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
Совместимость
PostgreSQL принимает идентификаторы ("
), тогда как стандарт SQL требует, чтобы имя роли записывалось в виде строковой константы. Стандарт не позволяет выполнять эту команду в транзакции; в PostgreSQL такого ограничения нет, так как для него нет причины. Указания имя_роли
"SESSION
и LOCAL
относятся к расширениям PostgreSQL, так же, как и синтаксис RESET
.