SET ROLE
SET ROLE — установить идентификатор текущего пользователя в рамках сеанса
Синтаксис
SET [ SESSION | LOCAL ] ROLE имя_роли
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLEОписание
Эта команда меняет идентификатор текущего пользователя в активном сеансе SQL на имя_роли. Имя роли может быть записано в виде идентификатора или строковой константы. После SET ROLE, права доступа для команд SQL проверяются так, как если бы сеанс изначально был установлен с этим именем роли. Имейте в виду, что команды SET ROLE и SET SESSION AUTHORIZATION — исключения: для проверки прав доступа продолжают использоваться текущий и начальный пользователи сеанса (аутентифицированный пользователь) соответственно.
Текущий пользователь должен либо непосредственно обладать атрибутом SET для указанного имени_роли, либо опосредованно по цепочке членства в роли с атрибутом SET. (Если пользователь сеанса является суперпользователем, он может выбрать любую роль.)
Указания SESSION и LOCAL действуют на эту команду так же, как и на обычную команду SET.
SET ROLE NONE устанавливает в качестве идентификатора текущего пользователя идентификатор текущего пользователя сеанса, выдаваемый функцией session_user. RESET ROLE устанавливает в качестве идентификатора текущего пользователя значение, заданное во время подключения параметрами командной строки либо командой ALTER ROLE или ALTER DATABASE. Если же такое значение не задано, в качестве идентификатора текущего пользователя так же устанавливается идентификатор текущего пользователя сеанса. Эти формы могут выполняться любыми пользователями.
Примечания
С помощью этой команды можно как добавить права, так и ограничить их. Если роль пользователя сеанса получила членство в роли с WITH INHERIT TRUE, она автоматически получает права такой роли. В этом случае SET ROLE убирает все права, кроме принадлежащих этой роли и наследуемых ей. С другой стороны, если роль получила членство с WITH INHERIT FALSE, по умолчанию она не получает доступ к правам назначенной роли. Однако если членство в роли было выдано с WITH SET TRUE, пользователь сеанса может воспользоваться SET ROLE, чтобы убрать права, назначенные непосредственно пользователю сеанса, и вместо них назначить права, которые имеет указанная роль. Если роль получила членство с WITH INHERIT FALSE, SET FALSE, доступ к правам назначенной роли нельзя получить и с SET ROLE.
SET ROLE оказывает действие, сравнимое с SET SESSION AUTHORIZATION, но проверка прав выполняется по-другому. Также SET SESSION AUTHORIZATION определяет, какие роли разрешены для последующей SET ROLE, тогда как при смене ролей командой 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
Совместимость
Postgres Pro принимает идентификаторы ("), тогда как стандарт SQL требует, чтобы имя роли записывалось в виде строковой константы. Стандарт не позволяет выполнять эту команду в транзакции; в Postgres Pro такого ограничения нет, так как для него нет причины. Указания имя_роли"SESSION и LOCAL относятся к расширениям Postgres Pro, так же, как и синтаксис RESET.
См. также
SET SESSION AUTHORIZATIONSET ROLE
SET ROLE — set the current user identifier of the current session
Synopsis
SET [ SESSION | LOCAL ] ROLE role_name
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
Description
This command sets the current user identifier of the current SQL session to be role_name. The role name can be written as either an identifier or a string literal. After SET ROLE, permissions checking for SQL commands is carried out as though the named role were the one that had logged in originally. Note that SET ROLE and SET SESSION AUTHORIZATION are exceptions; permissions checks for those continue to use the current session user and the initial session user (the authenticated user), respectively.
The current session user must have the SET option for the specified role_name, either directly or indirectly via a chain of memberships with the SET option. (If the session user is a superuser, any role can be selected.)
The SESSION and LOCAL modifiers act the same as for the regular SET command.
SET ROLE NONE sets the current user identifier to the current session user identifier, as returned by session_user. RESET ROLE sets the current user identifier to the connection-time setting specified by the command-line options, ALTER ROLE, or ALTER DATABASE, if any such settings exist. Otherwise, RESET ROLE sets the current user identifier to the current session user identifier. These forms can be executed by any user.
Notes
Using this command, it is possible to either add privileges or restrict one's privileges. If the session user role has been granted memberships WITH INHERIT TRUE, it automatically has all the privileges of every such role. In this case, SET ROLE effectively drops all the privileges except for those which the target role directly possesses or inherits. On the other hand, if the session user role has been granted memberships WITH INHERIT FALSE, the privileges of the granted roles can't be accessed by default. However, if the role was granted WITH SET TRUE, the session user can use SET ROLE to drop the privileges assigned directly to the session user and instead acquire the privileges available to the named role. If the role was granted WITH INHERIT FALSE, SET FALSE then the privileges of that role cannot be exercised either with or without SET ROLE.
SET ROLE has effects comparable to SET SESSION AUTHORIZATION, but the privilege checks involved are quite different. Also, SET SESSION AUTHORIZATION determines which roles are allowable for later SET ROLE commands, whereas changing roles with SET ROLE does not change the set of roles allowed to a later SET ROLE.
SET ROLE does not process session variables as specified by the role's ALTER ROLE settings; this only happens during login.
SET ROLE cannot be used within a SECURITY DEFINER function.
Examples
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
Compatibility
Postgres Pro allows identifier syntax ("), while the SQL standard requires the role name to be written as a string literal. SQL does not allow this command during a transaction; Postgres Pro does not make this restriction because there is no reason to. The rolename"SESSION and LOCAL modifiers are a Postgres Pro extension, as is the RESET syntax.