SET ROLE — 設定當前會話的當前使用者識別符號
SET [ SESSION | LOCAL ] ROLE role_name
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
此命令將當前 SQL 會話的當前使用者識別符號設定為 role_name
。角色名可以寫成識別符號或字串字面量。執行 SET ROLE
後,SQL 命令的許可權檢查將按照該角色是最初登入的使用者來執行。請注意,SET ROLE
和 SET SESSION AUTHORIZATION
是例外;它們的許可權檢查分別繼續使用當前會話使用者和初始會話使用者(即 認證使用者)。
當前會話使用者必須擁有指定 role_name
的 SET
選項,無論是直接擁有還是透過擁有 SET
選項的成員資格鏈間接擁有。(如果會話使用者是超級使用者,則可以選擇任何角色。)
SESSION
和 LOCAL
修飾符與常規 SET
命令的作用相同。
SET ROLE NONE
將當前使用者識別符號設定為 session_user
返回的當前會話使用者識別符號。 RESET ROLE
將當前使用者識別符號設定為由 命令列選項、ALTER ROLE
或 ALTER 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 允許識別符號語法("
),而 SQL 標準要求角色名必須寫成字串字面量。SQL 在事務期間不允許此命令;PostgreSQL 沒有此限制,因為沒有理由這樣做。rolename
"SESSION
和 LOCAL
修飾符是 PostgreSQL 的擴充套件,RESET
語法也是如此。
如果您在文件中發現任何不正確之處、與您對特定功能的體驗不符之處或需要進一步澄清之處,請使用 此表格 報告文件問題。