2025年9月25日: PostgreSQL 18 釋出!
支援版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 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

SET ROLE

SET ROLE — 設定當前會話的當前使用者識別符號

概要

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

描述

此命令將當前 SQL 會話的當前使用者識別符號設定為 role_name。角色名可以寫成識別符號或字串字面量。執行 SET ROLE 後,SQL 命令的許可權檢查將按照該角色是最初登入的使用者來執行。請注意,SET ROLESET SESSION AUTHORIZATION 是例外;它們的許可權檢查分別繼續使用當前會話使用者和初始會話使用者(即 認證使用者)。

當前會話使用者必須擁有指定 role_nameSET 選項,無論是直接擁有還是透過擁有 SET 選項的成員資格鏈間接擁有。(如果會話使用者是超級使用者,則可以選擇任何角色。)

SESSIONLOCAL 修飾符與常規 SET 命令的作用相同。

SET ROLE NONE 將當前使用者識別符號設定為 session_user 返回的當前會話使用者識別符號。 RESET ROLE 將當前使用者識別符號設定為由 命令列選項ALTER ROLEALTER 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 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 允許識別符號語法("rolename"),而 SQL 標準要求角色名必須寫成字串字面量。SQL 在事務期間不允許此命令;PostgreSQL 沒有此限制,因為沒有理由這樣做。SESSIONLOCAL 修飾符是 PostgreSQL 的擴充套件,RESET 語法也是如此。

提交更正

如果您在文件中發現任何不正確之處、與您對特定功能的體驗不符之處或需要進一步澄清之處,請使用 此表格 報告文件問題。