支援的版本: 目前 (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_name 具有 SET 選項,可以直接或透過具有 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 語法也是如此。

提交更正

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