======== SET ROLE ======== .. container:: refentry :name: SQL-SET-ROLE .. container:: titlepage .. container:: refnamediv .. rubric:: SET ROLE :name: set-role SET ROLE — 设置当前会话的当前用户标识符 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis SET [ SESSION | LOCAL ] ROLE role_name SET [ SESSION | LOCAL ] ROLE NONE RESET ROLE .. container:: refsect1 :name: id-1.9.3.175.5 .. rubric:: 描述 :name: 描述 这个命令把当前 SQL 会话的当前用户标识符设置为 *``role_name``*\ 。 角色名可以写成一个标识符或者一个字符串。在 ``SET ROLE``\ 之后,对 SQL 命令的权限检查时就 好像该角色就是原先登录的角色一样。 当前会话用户必须是指定的 角色\ *``role_name``* 的一个成员(如果会话用户是一个超级用户,则可以选择任何角色)。 ``SESSION``\ 和\ ``LOCAL``\ 修饰符发挥的作用和 常规的\ `SET `__\ 命令一样。 ``NONE``\ 和\ ``RESET``\ 形式把当前用户标识符 重置为当前会话用户标识符。这些形式可以由任何用户执行。 .. container:: refsect1 :name: id-1.9.3.175.6 .. rubric:: 注解 :name: 注解 使用这个命令可以增加特权或者限制特权。如果会话用户角色具有 ``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``\ 函数中使用。 .. container:: refsect1 :name: id-1.9.3.175.7 .. rubric:: 示例 :name: 示例 .. code:: programlisting 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 .. container:: refsect1 :name: id-1.9.3.175.8 .. rubric:: 兼容性 :name: 兼容性 PostgreSQL允许标识符 语法(\ ``"rolename``"),而 SQL 标准要求 角色名被写成字符串。SQL 不允许在事务中使用这个命令,而 PostgreSQL并不做此限 制,因为并没有原因需要这样做。和\ ``RESET``\ 语法 一样,\ ``SESSION``\ 和 ``LOCAL``\ 修饰符是一种 PostgreSQL扩展。 .. container:: refsect1 :name: id-1.9.3.175.9 .. rubric:: 另见 :name: 另见 `SET SESSION AUTHORIZATION `__