↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1
历史版本PostgreSQL 8.2 已于 2011 年 12 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

SET ROLE

SET ROLE — 设置当前会话的当前用户标识符

大纲

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

描述

该命令把当前 SQL 会话的当前用户标识符设置为 rolename。角色名可以写成标识符或字符串字面量。在 SET ROLE 之后,SQL 命令的权限检查会视同指定角色是最初登录的角色。

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

SESSION 和 LOCAL 修饰符的作用与常规的 SET 命令相同。

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

注解

使用这个命令,既可以增加权限,也可以限制自己的权限。如果会话用户角色具有 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不能在 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

兼容性

PostgreSQL允许使用标识符语法 ("rolename"),而 SQL 标准要求将角色名写成字符串字面量。 SQL 不允许在事务中执行这个命令; PostgreSQL不施加这一限制,因为没有理由这样做。 SESSION和LOCAL修饰符,以及 RESET语法,都是PostgreSQL扩展。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。