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