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