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

5.8. 權限 #

當建立一個物件時,會被指定一個擁有者。擁有者通常是執行建立語句的角色。對於大多數類型的物件,初始狀態是只有擁有者(或超級使用者)才能對該物件執行任何操作。要允許其他角色使用它,必須授予權限

有不同種類的權限:SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERCREATECONNECTTEMPORARYEXECUTEUSAGESETALTER SYSTEMMAINTAIN。適用於特定物件的權限,取決於物件的類型(表、函式等)。關於這些權限含義的更多細節將在下面顯示。以下章節也將向您展示如何使用這些權限。

修改或刪除物件的權利是物件擁有者固有的,不能被授予或撤銷。(然而,像所有權限一樣,該權利可以由擁有角色的成員繼承;請參閱第 21.3 節。)

可以使用適用於該物件的 ALTER 命令將物件分配給新的擁有者,例如

ALTER TABLE table_name OWNER TO new_owner;

超級使用者總是能夠執行此操作;普通角色只有在同時是物件的當前擁有者(或繼承了擁有角色的權限)並且能夠 SET ROLE 到新的擁有角色時才能執行此操作。

要分配權限,使用 GRANT 命令。例如,如果 joe 是一個現有的角色,並且 accounts 是一個現有的表,則可以使用以下命令授予更新表的權限

GRANT UPDATE ON accounts TO joe;

在特定權限的位置寫入 ALL,會授予與物件類型相關的所有權限。

特殊的 角色名稱 PUBLIC 可用於將權限授予系統上的每個角色。此外,可以設定 群組角色來協助管理資料庫中大量使用者時的權限 — 有關詳細資訊,請參閱第 21 章

要撤銷先前授予的權限,請使用名稱恰當的 REVOKE 命令

REVOKE ALL ON accounts FROM PUBLIC;

通常,只有物件的擁有者(或超級使用者)才能授予或撤銷物件的權限。但是,可以授予 帶授予選項的權限,這會賦予接收者轉而將其授予其他人的權利。如果隨後撤銷授予選項,則所有從該接收者收到權限的人(直接或通過授予鏈)都將失去該權限。有關詳細資訊,請參閱 GRANTREVOKE 參考頁面。

物件的擁有者可以選擇撤銷他們自己的普通權限,例如,使表對他們自己和其他人都是唯讀的。但是,擁有者始終被視為擁有所有授予選項,因此他們始終可以重新授予自己的權限。

可用的權限如下

SELECT #

允許從表、檢視表、實體化檢視表或其他類似表的物件的任何欄位或特定欄位執行 SELECT。 也允許使用 COPY TO。 在 UPDATEDELETEMERGE 中參考現有欄位值也需要此權限。 對於序列,此權限也允許使用 currval 函數。 對於大型物件,此權限允許讀取該物件。

INSERT #

允許將新列 INSERT 到表、檢視表等。 可以授予特定欄位,在這種情況下,只有這些欄位可以在 INSERT 命令中被賦值(因此其他欄位將收到預設值)。 也允許使用 COPY FROM

UPDATE #

允許對資料表、檢視表等物件的任何欄位或特定欄位執行 UPDATE 指令。(實際上,任何重要的 UPDATE 指令都需要 SELECT 權限,因為它必須引用資料表欄位才能判斷要更新哪些列,以及/或計算欄位的新值。)SELECT ... FOR UPDATESELECT ... FOR SHARE 也至少需要在一個欄位上擁有此權限,此外還需要 SELECT 權限。對於序列,此權限允許使用 nextvalsetval 函式。對於大型物件,此權限允許寫入或截斷物件。

DELETE #

允許從資料表、檢視表等物件中 DELETE 一列資料。(實際上,任何重要的 DELETE 指令都需要 SELECT 權限,因為它必須引用資料表欄位才能判斷要刪除哪些列。)

TRUNCATE #

允許對資料表執行 TRUNCATE 指令。

REFERENCES #

允許建立參考資料表或資料表特定欄位的外鍵約束。

TRIGGER #

允許在資料表、檢視表等物件上建立觸發器。

CREATE #

對於資料庫,允許在資料庫內建立新的結構描述和發布,並允許在資料庫內安裝受信任的擴充功能。

對於結構描述,允許在結構描述內建立新的物件。若要重新命名現有物件,您必須擁有該物件擁有包含結構描述的此權限。

對於表空間,允許在表空間內建立資料表、索引和暫存檔案,並允許建立將表空間作為其預設表空間的資料庫。

請注意,撤銷此權限不會改變現有物件的存在或位置。

CONNECT #

允許被授權者連線到資料庫。此權限會在連線啟動時進行檢查(除了檢查 pg_hba.conf 強加的任何限制之外)。

TEMPORARY #

允許在使用資料庫時建立暫存資料表。

EXECUTE #

允許呼叫函式或程序,包括使用在函式之上實作的任何運算符。 這是適用於函式和程序的唯一權限類型。

USAGE #

對於程序語言,允許使用該語言來建立該語言中的函式。這是適用於程序語言的唯一權限類型。

對於結構描述,允許存取結構描述中包含的物件(假設也滿足物件自身的權限要求)。 本質上,這允許被授權者 查找結構描述中的物件。 如果沒有此權限,仍然可以查看物件名稱,例如,透過查詢系統目錄。 此外,在撤銷此權限後,現有的工作階段可能會有先前執行過此查找的陳述式,因此這不是防止物件存取的完全安全的方式。

對於序列,允許使用 currvalnextval 函式。

對於類型和域,允許在建立資料表、函式和其他結構描述物件時使用該類型或域。(請注意,此權限不會控制所有 用法 類型,例如在查詢中出現的類型值。它只會阻止建立依賴於該類型的物件。此權限的主要目的是控制哪些使用者可以建立對某類型的依賴,這可能會阻止所有者稍後更改該類型。)

對於外部資料包裝器,允許使用外部資料包裝器建立新的伺服器。

對於外部伺服器,允許使用伺服器建立外部資料表。被授權者也可以建立、更改或刪除與該伺服器關聯的自己的使用者對應。

SET #

允許在目前的工作階段中將伺服器組態參數設定為新值。(雖然此權限可以授予給任何參數,但它只有對於通常需要超級使用者權限才能設定的參數才有意義。)

ALTER SYSTEM #

允許使用 ALTER SYSTEM 指令將伺服器組態參數配置為新值。

MAINTAIN #

允許對關係執行 VACUUMANALYZECLUSTERREFRESH MATERIALIZED VIEWREINDEXLOCK TABLE 指令。

其他指令所需的權限列在相應指令的參考頁面上。

PostgreSQL 在建立物件時,預設會將某些物件類型的權限授予 PUBLIC。 預設情況下,不會將任何權限授予 PUBLIC 給資料表、資料表欄位、序列、外部資料包裝器、外部伺服器、大型物件、結構描述、表空間或組態參數。 對於其他類型的物件,預設授予 PUBLIC 的權限如下:資料庫的 CONNECTTEMPORARY(建立暫存資料表)權限;函式和程序的 EXECUTE 權限;以及語言和資料類型(包括域)的 USAGE 權限。 物件所有者當然可以 REVOKE 預設和明確授予的權限。(為了獲得最大安全性,請在建立物件的同一個交易中發出 REVOKE;這樣就不會有其他使用者可以使用該物件的時間窗口。) 此外,這些預設權限設定可以使用 ALTER DEFAULT PRIVILEGES 指令覆寫。

表 5.1 顯示了在 ACL(存取控制列表)值中用於這些權限類型的一個字母縮寫。您將在下面列出的 psql 指令的輸出中看到這些字母,或者在查看系統目錄的 ACL 欄位時看到它們。

表 5.1。ACL 權限縮寫

權限 縮寫 適用的物件類型
SELECT r讀取 LARGE OBJECTSEQUENCETABLE(和類似資料表的物件)、資料表欄位
INSERT a追加 TABLE,資料表欄位
UPDATE(更新) w (「write(寫入)」) LARGE OBJECTSEQUENCETABLE,資料表欄位
DELETE(刪除) d TABLE
TRUNCATE(截斷) D TABLE
REFERENCES(參考) x TABLE,資料表欄位
TRIGGER(觸發器) t TABLE
CREATE(建立) C DATABASESCHEMATABLESPACE
CONNECT(連線) c DATABASE
TEMPORARY(暫時的) T DATABASE
EXECUTE(執行) X FUNCTIONPROCEDURE
USAGE(使用權) U DOMAINFOREIGN DATA WRAPPERFOREIGN SERVERLANGUAGESCHEMASEQUENCETYPE
SET(設定) s PARAMETER(參數)
ALTER SYSTEM A PARAMETER(參數)
MAINTAIN(維護) m TABLE

表 5.2所示,彙總了每種 SQL 物件可用的權限,使用上面顯示的縮寫。它還顯示了可以用於檢查每種物件類型權限設定的 psql 命令。

表 5.2. 權限總結

物件類型 所有權限 預設 PUBLIC 權限 psql 命令
DATABASE CTc Tc \l
DOMAIN U U \dD+
FUNCTIONPROCEDURE X X \df+
FOREIGN DATA WRAPPER U none \dew+
FOREIGN SERVER U none \des+
LANGUAGE U U \dL+
LARGE OBJECT rw none \dl+
PARAMETER(參數) sA none \dconfig+
SCHEMA UC none \dn+
SEQUENCE rwU none \dp
TABLE(和類似資料表的物件) arwdDxtm none \dp
資料表欄位 arwx none \dp
TABLESPACE C none \db+
TYPE U U \dT+

特定物件已授予的權限顯示為 aclitem 條目的列表,每個條目的格式如下

grantee=privilege-abbreviation[*].../grantor

每個 aclitem 列出了一個授權物件的所有權限,這些權限由特定的授權者授予。特定權限由 表 5.1 中的單字母縮寫表示,如果權限是使用授予選項授予的,則附加 *。例如,calvin=r*w/hobbes 指定角色 calvin 擁有帶有授予選項 (*) 的 SELECT (r) 權限,以及不可授予的 UPDATE (w) 權限,兩者均由角色 hobbes 授予。如果 calvin 還擁有由不同授權者授予的相同物件的某些權限,這些權限將顯示為單獨的 aclitem 條目。aclitem 中的空授權物件欄位代表 PUBLIC

作為一個例子,假設使用者 miriam 建立資料表 mytable 並執行

GRANT SELECT ON mytable TO PUBLIC;
GRANT SELECT, UPDATE, INSERT ON mytable TO admin;
GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;

然後 psql\dp 命令將顯示

=> \dp mytable
                                  Access privileges
 Schema |  Name   | Type  |   Access privileges    |   Column privileges   | Policies
--------+---------+-------+------------------------+-----------------------+----------
 public | mytable | table | miriam=arwdDxtm/miriam+| col1:                +|
        |         |       | =r/miriam             +|   miriam_rw=rw/miriam |
        |         |       | admin=arw/miriam       |                       |
(1 row)

如果給定物件的「存取權限」欄位為空,則表示該物件具有預設權限(即,其在相關系統目錄中的權限條目為 null)。預設權限始終包括擁有者的所有權限,並且可以包括 PUBLIC 的某些權限,如上所述。物件上的第一個 GRANTREVOKE 將實例化預設權限(例如,產生 miriam=arwdDxt/miriam),然後根據指定的請求修改它們。同樣,僅為具有非預設權限的欄位顯示「欄位權限」中的條目。(注意:為此目的,「預設權限」始終表示物件類型的內建預設權限。權限已受到 ALTER DEFAULT PRIVILEGES 命令影響的物件將始終顯示帶有明確權限條目,其中包括 ALTER 的效果。)

請注意,擁有者的隱含授予選項未在存取權限顯示中標記。* 僅當已明確授予某人授予選項時才會顯示。

當物件的權限條目非空但為空時,「存取權限」欄位顯示 (none)。這表示根本沒有授予任何權限,即使是對物件的擁有者也是如此 — 這是一種罕見的情況。(在這種情況下,擁有者仍然具有隱含的授予選項,因此可以重新授予她自己的權限;但她目前沒有任何權限。)

提交更正

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