支援的版本:目前 (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

21.2. 角色屬性 #

資料庫角色可以擁有多個屬性,這些屬性定義了其權限並與客戶端驗證系統互動。

登入權限

只有具有 LOGIN 屬性的角色才能用作資料庫連線的初始角色名稱。具有 LOGIN 屬性的角色可以被視為與資料庫使用者相同。要建立具有登入權限的角色,請使用以下任一種方式:

CREATE ROLE name LOGIN;
CREATE USER name;

CREATE USER 等同於 CREATE ROLE,除了 CREATE USER 預設包含 LOGIN,而 CREATE ROLE 不包含。)

超級使用者狀態

資料庫超級使用者繞過所有權限檢查,除了登入權限。這是一種危險的權限,不應隨意使用;最好以非超級使用者的角色執行大部分工作。要建立新的資料庫超級使用者,請使用 CREATE ROLE name SUPERUSER。您必須以已經是超級使用者的角色執行此操作。

資料庫建立

必須明確授予角色建立資料庫的權限(超級使用者除外,因為他們繞過所有權限檢查)。要建立這樣的角色,請使用 CREATE ROLE name CREATEDB

角色建立

必須明確授予角色建立更多角色的權限(超級使用者除外,因為他們繞過所有權限檢查)。要建立這樣的角色,請使用 CREATE ROLE name CREATEROLE。具有 CREATEROLE 權限的角色可以修改和刪除已授予具有 ADMIN 選項的 CREATEROLE 使用者的角色。當不是超級使用者的 CREATEROLE 使用者建立新角色時,會自動發生這種授予,因此預設情況下,CREATEROLE 使用者可以修改和刪除他們建立的角色。修改角色包括可以使用 ALTER ROLE 進行的大部分變更,例如變更密碼。它還包括可以使用 COMMENTSECURITY LABEL 命令對角色進行的修改。

但是,CREATEROLE 不會授予建立 SUPERUSER 角色的能力,也不會授予對已存在的 SUPERUSER 角色的任何權力。此外,CREATEROLE 不會授予建立 REPLICATION 使用者的權力,也不會授予或撤銷 REPLICATION 權限的能力,也不會授予修改此類使用者角色屬性的能力。但是,它允許對 REPLICATION 角色使用 ALTER ROLE ... SETALTER ROLE ... RENAME,以及使用 COMMENT ON ROLESECURITY LABEL ON ROLEDROP ROLE。最後,CREATEROLE 不會授予授予或撤銷 BYPASSRLS 權限的能力。

啟動複製

必須明確授予角色啟動串流複製的權限(超級使用者除外,因為他們繞過所有權限檢查)。用於串流複製的角色也必須具有 LOGIN 權限。要建立這樣的角色,請使用 CREATE ROLE name REPLICATION LOGIN

密碼

只有在客戶端驗證方法要求使用者在連線到資料庫時提供密碼時,密碼才有意義。passwordmd5 驗證方法會使用密碼。資料庫密碼與作業系統密碼是分開的。在建立角色時使用 CREATE ROLE name PASSWORD 'string' 指定密碼。

權限繼承

預設情況下,角色會繼承其所屬角色的權限。但是,要建立一個預設不繼承權限的角色,請使用 CREATE ROLE name NOINHERIT。另外,可以使用 WITH INHERIT TRUEWITH INHERIT FALSE 來覆寫個別授權的繼承行為。

繞過列層級安全性

角色必須明確授予權限才能繞過每個列層級安全性 (RLS) 策略(超級使用者除外,因為超級使用者會繞過所有權限檢查)。要建立這樣的角色,請以超級使用者身分使用 CREATE ROLE name BYPASSRLS

連線限制

連線限制可以指定角色可以建立多少個並行連線。-1(預設值)表示沒有限制。 使用 CREATE ROLE name CONNECTION LIMIT 'integer' 在建立角色時指定連線限制。

角色的屬性可以在建立後使用 ALTER ROLE 修改。 有關詳細資訊,請參閱 CREATE ROLEALTER ROLE 命令的參考頁面。

角色還可以針對 第 19 章 中描述的許多執行階段組態設定具有角色特定的預設值。例如,如果因為某種原因您想要在每次連線時停用索引掃描(提示:這不是一個好主意),您可以使用

ALTER ROLE myname SET enable_indexscan TO off;

這將儲存設定(但不會立即設定)。在該角色的後續連線中,它會像在會話開始之前執行了 SET enable_indexscan TO off 一樣。您仍然可以在會話期間變更此設定;它只會是預設值。若要移除角色特定的預設設定,請使用 ALTER ROLE rolename RESET varname。請注意,附加到沒有 LOGIN 權限的角色的角色特定預設值相當無用,因為它們永遠不會被調用。

當非超級使用者使用 CREATEROLE 權限建立角色時,建立的角色會自動授予回建立使用者,就像啟動超級使用者執行了命令 GRANT created_user TO creating_user WITH ADMIN TRUE, SET FALSE, INHERIT FALSE 一樣。由於 CREATEROLE 使用者只有在擁有角色的 ADMIN OPTION 時才能對現有角色行使特殊權限,因此此授權僅足以允許 CREATEROLE 使用者管理他們建立的角色。但是,由於它是使用 INHERIT FALSE, SET FALSE 建立的,因此 CREATEROLE 使用者不會繼承已建立角色的權限,也不能使用 SET ROLE 存取該角色的權限。但是,由於任何擁有角色的 ADMIN OPTION 的使用者都可以將該角色的成員資格授予任何其他使用者,因此 CREATEROLE 使用者可以通過簡單地使用 INHERIT 和/或 SET 選項將該角色授予回自己來獲得對已建立角色的存取權。因此,權限預設不繼承或預設不授予 SET ROLE 是一種防止意外的保護措施,而不是一種安全功能。另請注意,由於此自動授權是由啟動超級使用者授予的,因此 CREATEROLE 使用者無法撤銷或變更它;但是,任何超級使用者都可以撤銷它、修改它和/或向其他 CREATEROLE 使用者發出額外的此類授權。無論何時哪些 CREATEROLE 使用者擁有角色的 ADMIN OPTION 都可以管理它。

提交更正

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