Перейти к основному содержимому

SET ROLE

примечание

Эта страница переведена при помощи нейросети GigaChat.

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

Синтаксис

SET [ SESSION | LOCAL ] ROLE role_name
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE

Описание

Эта команда устанавливает текущий идентификатор пользователя текущей SQL-сессии равным role_name. Имя роли может быть записано либо как идентификатор, либо как строковый литерал. После выполнения команды проверки разрешений для команд SQL выполняются так, как если бы указанный пользователь был тем, кто изначально вошел в систему. Обратите внимание, что SET ROLE и SET SESSION AUTHORIZATION являются исключениями: проверка разрешений для них продолжает использовать текущего пользователя сеанса и начального пользователя сеанса (пользователь, прошедший аутентификацию) соответственно.

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

Модификаторы SESSION и LOCAL действуют так же, как для обычной команды SET.

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

Примечания

Используя эту команду, можно либо добавить привилегии, либо ограничить свои привилегии. Если роль пользователя сеанса была наделена правами членства WITH INHERIT TRUE, она автоматически получает все права каждой такой роли. В этом случае SET ROLE эффективно удаляет все привилегии, кроме тех, которыми целевая роль обладает непосредственно или наследует их. С другой стороны, если роль пользователя сеанса получила членство WITH INHERIT FALSE, привилегии предоставленных ролей по умолчанию недоступны. Однако, если роли были предоставлены WITH SET TRUE, пользователь сеанса может использовать SET ROLE для удаления привилегий, назначенных непосредственно пользователю сеанса, и вместо этого получить доступ к привилегиям, доступным для указанной роли. Если роли были предоставлены WITH INHERIT FALSE, SET FALSE, привилегиями этой роли нельзя воспользоваться ни при наличии, ни при отсутствии SET ROLE.

Команда SET ROLE по действию похожа на SET SESSION AUTHORIZATION, но они различаются в проверке прав. Кроме того, SET SESSION AUTHORIZATION определяет, к каким ролям можно будет позже переключаться через 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 допускает использование как строковых литералов, так и синтаксиса идентификаторов ("rolename"), в то время как стандарт SQL требует только строковые литералы. Также, в отличие от SQL-стандарта, PostgreSQL разрешает выполнение этой команды внутри транзакции. Модификаторы SESSION, LOCAL и синтаксис RESET являются расширениями PostgreSQL.

Смотрите также

SET SESSION AUTHORIZATION