PostgreSQL SET ROLE
SET ROLE — 设置当前会话的当前用户标识符
大纲
SET [ SESSION | LOCAL ] ROLE role_name
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
描述
这个命令把当前 SQL 会话的当前用户标识符设置为 role_name
。 角色名可以写成一个标识符或者一个字符串。在 SET ROLE
之后,对 SQL 命令的权限检查时就 好像该角色就是原先登录的角色一样。
当前会话用户必须是指定的 角色role_name
的一个成员(如果会话用户是一个超级用户,则可以选择任何角色)。
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
不会处理角色的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
兼容性
PostgreSQL允许标识符 语法("
),而 SQL 标准要求 角色名被写成字符串。SQL 不允许在事务中使用这个命令,而 PostgreSQL并不做此限 制,因为并没有原因需要这样做。和rolename
"RESET
语法 一样,SESSION
和 LOCAL
修饰符是一种 PostgreSQL扩展。