SET ROLE
Эта страница переведена при помощи нейросети GigaChat.
SET ROLE — установка текущего идентификатора пользователя текущего сеанса.
Синтаксис
SET [ SESSION | LOCAL ] ROLE role_name
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
Описание
SET ROLE устанавливает идентификатор текущего пользователя в рамках текущей SQL-сессии равным role_name. Имя роли может быть указано либо как идентификатор, либо как строковый литерал. После выполнения SET ROLE проверка прав доступа на команды SQL выполняется так, как если бы указанный пользователь вошел в систему под этой ролью изначально.
Указывая role_name, текущий пользователь должен являться членом этой роли. Если пользователь сеанса — суперпользователь, он может переключаться на любую роль.
Модификаторы SESSION и LOCAL действуют так же, как для обычной команды SET.
Команда SET ROLE NONE сбрасывает текущую роль и возвращает идентификатор пользователя к значению session_user. Команда RESET ROLE возвращает идентификатор пользователя к настройке, указанной при подключении (например, через параметры командной строки, ALTER ROLE или ALTER DATABASE), если таковая была. В противном случае она также возвращает значение session_user. Эти команды может выполнять любой пользователь.
Примечания
С помощью SET ROLE можно как получить дополнительные права, так и ограничить свои текущие. Если роль пользователя имеет атрибут INHERIT, то она автоматически обладает всеми правами тех ролей, на которые может переключаться через SET ROLE. В этом случае команда удаляет все права, выданные напрямую пользователю и другим ролям, в которых он состоит, оставляя только права указанной роли.
Если же роль пользователя имеет атрибут NOINHERIT, то 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.