2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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 命令中為這些列賦值(其他列將因此接收預設值)。也允許使用 COPY FROM

UPDATE #

允許更新表、檢視等中的任何列或特定列。(實際上,任何非平凡的 UPDATE 命令都需要 SELECT 許可權,因為它必須引用表列來確定要更新哪些行,以及/或計算列的新值。)SELECT ... FOR UPDATESELECT ... FOR SHARE 也需要至少一列的此許可權,外加 SELECT 許可權。對於序列,此許可權允許使用 nextvalsetval 函式。對於大物件,此許可權允許寫入或截斷物件。

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 以及資料庫物件統計資訊操作函式(請參閱表 9.105)。

其他命令所需的許可權列在該命令的參考頁面上。

PostgreSQL 預設向 PUBLIC 授予某些型別的物件的許可權。預設情況下,不對錶、表列、序列、外部資料包裝器、外部伺服器、大物件、模式、表空間或配置引數授予任何許可權給 PUBLIC。對於其他型別的物件,授予 PUBLIC 的預設許可權如下:資料庫的 CONNECTTEMPORARY(建立臨時表)許可權;函式和過程的 EXECUTE 許可權;以及語言和資料型別(包括域)的 USAGE 許可權。當然,物件所有者可以 REVOKE 預設和明確授予的許可權。(為了最大程度的安全,請在建立物件的同一事務中執行 REVOKE;這樣就不會有其他使用者可以利用該物件的視窗。)此外,可以使用 ALTER DEFAULT PRIVILEGES 命令覆蓋這些預設許可權設定。

ACL 值中,表 5.1 顯示了用於這些許可權型別的單字母縮寫。您將在下面列出的 psql 命令的輸出中看到這些字母,或者在檢視ACL系統目錄的列時看到。

表 5.1. ACL許可權縮寫

許可權 縮寫 適用的物件型別
SELECT r (“讀取”) LARGE OBJECTSEQUENCETABLE(及類表物件)、表列
INSERT a (“追加”) TABLE、表列
UPDATE w (“寫入”) 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 一個 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
Table column arwx none \dp
TABLESPACE C none \db+
TYPE U U \dT+

為特定物件授予的許可權顯示為 aclitem 條目列表,每個條目的格式為

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

每個 aclitem 列出了由特定授權者授予的、一個被授權者的所有許可權。特定許可權由 表 5.1 中的單字母縮寫表示,如果許可權是授予的,則附加“*”。例如,calvin=r*w/hobbes 指定角色 calvin 擁有授予選項(*)的 SELECTr)許可權以及不可授予的 UPDATEw)許可權,這兩者都由角色 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 的效果。)

請注意,所有者隱式的授予選項未在訪問許可權顯示中標記。只有當授予選項明確授予某人時,才會出現“*”。

訪問許可權”列在物件的許可權條目非 null 但為空時顯示 (none)。這意味著根本沒有授予任何許可權,甚至沒有授予物件的所有者——這種情況很少見。(在這種情況下,所有者仍然擁有隱式的授予選項,因此可以重新授予自己的許可權;但她目前沒有任何許可權。)

提交更正

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