SET ROLE#

SET ROLE

SET ROLE

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

Синтаксис

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

Описание

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

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

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

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

Примечания

С помощью этой команды можно добавить привилегии или ограничить свои привилегии. Если роль пользователя сессии имеет атрибут 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 роли; это происходит только во время входа в систему.

Внутри функции SECURITY DEFINER нельзя использовать команду SET ROLE.

Примеры

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

Совместимость

Tantor SE позволяет использовать синтаксис идентификаторов ("rolename"), в то время как стандарт SQL требует, чтобы имя роли было записано как строковый литерал. SQL не позволяет выполнять эту команду во время транзакции; Tantor SE не делает этого ограничения, потому что нет причины для этого. Модификаторы SESSION и LOCAL являются расширением Tantor SE, также как и синтаксис RESET.