SET ROLE

本文介绍了SET ROLE的语法、示例等内容。

简介

这个命令把当前 SQL 会话的当前用户标识符设置为 role_name。 角色名可以写成一个标识符或者一个字符串。在 SET ROLE之后,对 SQL 命令的权限检查时就好像该角色就是原先登录的角色一样。

当前会话用户必须是指定的角色 role_name 的一个成员(如果会话用户是一个超级用户,则可以选择任何角色)。

SESSIONLOCAL修饰符发挥的作用和常规的SET命令一样。

NONERESET形式把当前用户标识符重置为当前会话用户标识符。这些形式可以由任何用户执行。

语法

    SET [ SESSION | LOCAL ] ROLE role_name
    SET [ SESSION | LOCAL ] ROLE NONE
    RESET ROLE

说明

使用这个命令可以增加特权或者限制特权。如果会话用户角色具有 INHERIT属性,则它会自动具有它能 SET ROLE到的所有角色的全部特权。在这种情况下 SET ROLE实际会删除所有直接分配给会话用户的特权以及分配给会话用户作为其成员的其他角色的特权,只留下所提及角色可用的特权。换句话说,如果会话用户没有 NOINHERIT属性,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