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