SET ROLE — установка идентификатора текущего пользователя текущего сеанса
SET [ SESSION | LOCAL ] ROLE role_name
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
Данная команда устанавливает идентификатор текущего пользователя текущего SQL-сеанса равным role_name. Имя роли может быть указано либо в виде идентификатора, либо в виде строкового литерала. После SET ROLE, проверка прав доступа для SQL-команд
выполняется так, как если бы указанная роль была той, под которой изначально
был выполнен вход. Обратите внимание, что SET ROLE и
SET SESSION AUTHORIZATION являются исключениями; проверки
прав для них по-прежнему используют текущего пользователя сеанса и исходного
пользователя сеанса ( аутентифицированный пользователь), соответственно.
Текущий пользователь сеанса должен обладать SET правом для
указанной role_name, либо
напрямую, либо косвенно через цепочку членства с
SET параметром.
(Если пользователь сеанса является суперпользователем, можно выбрать любую роль.)
Модификаторы SESSION и LOCAL действуют так же,
как и для обычной команды SET
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 параметрах роли; это происходит только при
входе в систему.
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
Digital Q.DataBase
допускает использование синтаксиса идентификатора ("), в то время как стандарт SQL требует, чтобы имя роли было записано в виде строкового литерала. SQL не разрешает использование этой команды внутри транзакции;
Digital Q.DataBase не накладывает данное ограничение, поскольку для этого нет оснований. имя_роли"SESSION и LOCAL модификаторы являются
Digital Q.DataBase расширением, как и
RESET синтаксис.