SET ROLE
SET ROLE — установить идентификатор текущего пользователя в рамках сеанса
Синтаксис
SET [ SESSION | LOCAL ] ROLE имя_роли
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
Описание
Эта команда меняет идентификатор текущего пользователя в активном сеансе SQL на имя_роли
. Имя роли может быть записано в виде идентификатора или строковой константы. После SET ROLE
, права доступа для команд SQL проверяются так, как если бы сеанс изначально был установлен с этим именем роли.
Текущий пользователь должен либо непосредственно обладать атрибутом 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 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
.