SET ROLE

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

Синтаксис

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

Описание

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

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

Указания SESSION и LOCAL действуют на эту команду так же, как и на обычную команду SET.

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

Примечания

С помощью этой команды можно как добавить права, так и ограничить их. Если роль пользователя сеанса получила членство в роли с WITH INHERIT TRUE, она автоматически получает права такой роли. В этом случае SET ROLE убирает все права, кроме принадлежащих этой роли и наследуемых ей. С другой стороны, если роль получила членство с WITH INHERIT FALSE, по умолчанию она не получает доступ к правам назначенной роли. Однако если членство в роли было выдано с WITH SET TRUE, пользователь сеанса может воспользоваться SET ROLE, чтобы убрать права, назначенные непосредственно пользователю сеанса, и вместо них назначить права, которые имеет указанная роль. Если роль получила членство с WITH INHERIT FALSE, SET FALSE, доступ к правам назначенной роли нельзя получить и с 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.