SET ROLE

Устанавливает текущий идентификатор роли для текущей сессии.

Обзор

SET [SESSION | LOCAL] ROLE rolename

SET [SESSION | LOCAL] ROLE NONE

RESET ROLE

Описание

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

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

Формы NONE и RESET сбрасывают текущий идентификатор роли до идентификатора текущей сессионной роли. Эти формы могут быть выполнены любым пользователем.

Параметры

SESSION

  • Указывает, что данная команда действует на текущую сессию. Это значение по умолчанию.

LOCAL

  • Указывает, что команда действует только в пределах текущей транзакции. После COMMIT или ROLLBACK снова вступают в силу настройки уровня сессии. Обратите внимание, что если SET LOCAL выполняется вне транзакции, это действие не оказывает эффекта.

rolename

  • Имя роли, которая будет использоваться для проверки прав доступа в рамках данной сессии.

NONE

RESET

  • Сбрасывает текущий идентификатор роли до идентификатора текущей сессионной роли (идентификатора роли, использованной при входе).

Примечание

Используйте эту команду для добавления или ограничения привилегий. Если роль пользователя сессии имеет атрибут INHERITS, она автоматически получает все привилегии каждой роли, для которой можно выполнить SET ROLE; в этом случае SET ROLE фактически отказывается от всех привилегий, назначенных непосредственно другим ролям, присвоенным пользователю сессии и его членам, оставляя только привилегии, доступные указанной роли. С другой стороны, если роль пользователя сессии имеет атрибут NOINHERITS, SET ROLE отменяет привилегии, назначенные непосредственно пользователю сессии, и вместо этого предоставляет привилегии, доступные указанной роли.

В частности, когда суперпользователь выбирает установку SET ROLE в качестве роли без прав суперпользователя, он теряет свои привилегии суперпользователя.

SET ROLE имеет тот же эффект, что и SET SESSION AUTHORIZATION, но механизм проверки привилегий существенно различается. Аналогично, SET SESSION AUTHORIZATION определяет, какие роли разрешены для последующего выполнения команды SET ROLE, и использование SET ROLE не изменяет набор ролей, которые могут быть заданы последующими командами SET ROLE.

SET ROLE не обрабатывает сессионные переменные, заданные параметрами ALTER 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

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

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