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
語法也是如此。
如果您在文件中發現任何不正確、與您特定功能的經驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。