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