當一個物件被建立時,它會被分配一個所有者。所有者通常是執行建立語句的角色。對於大多數型別的物件,初始狀態是隻有所有者(或超級使用者)才能對該物件進行任何操作。要允許其他角色使用它,必須授予許可權。
有不同種類的許可權:SELECT
、INSERT
、UPDATE
、DELETE
、TRUNCATE
、REFERENCES
、TRIGGER
、CREATE
、CONNECT
、TEMPORARY
、EXECUTE
、USAGE
、SET
、ALTER SYSTEM
和 MAINTAIN
。適用於特定物件的許可權取決於物件的型別(表、函式等)。下面將更詳細地介紹這些許可權的含義。接下來的章節也將展示這些許可權是如何使用的。
修改或銷燬物件的權利是物件所有者固有的,不能單獨授予或撤銷。(但是,像所有許可權一樣,該權利可以被擁有角色的成員繼承;請參閱第 21.3 節。)
可以使用適合物件的 ALTER
命令將物件分配給新的所有者,例如
ALTER TABLEtable_name
OWNER TOnew_owner
;
超級使用者始終可以執行此操作;普通角色只有在他們既是該物件當前的所有者(或繼承了所有者角色的許可權),又能 SET ROLE
到新的所有者角色時才能執行此操作。
要授予許可權,請使用 GRANT 命令。例如,如果 joe
是一個現有角色,並且 accounts
是一個現有表,則可以透過以下方式授予更新表的許可權:
GRANT UPDATE ON accounts TO joe;
用 ALL
替換特定許可權將授予與物件型別相關的所有許可權。
特殊的“角色”名稱 PUBLIC
可用於將許可權授予系統上的每個角色。此外,可以設定“組”角色來幫助管理許可權,當資料庫有許多使用者時——有關詳細資訊,請參閱第 21 章。
要撤銷先前授予的許可權,請使用相應命名的 REVOKE 命令
REVOKE ALL ON accounts FROM PUBLIC;
通常,只有物件的擁有者(或超級使用者)才能授予或撤銷物件的許可權。但是,可以“授予授予選項”來授予某個許可權,這使得接收者有權將其授予他人。如果授予選項隨後被撤銷,那麼從該接收者那裡獲得許可權的所有人(直接或透過一系列授予)都將失去該許可權。有關詳細資訊,請參閱 GRANT 和 REVOKE 參考頁面。
物件的所有者可以選擇撤銷其自身的普通許可權,例如,使其自己和其他人一樣,表成為只讀的。但所有者始終被視為擁有所有授予選項,因此他們始終可以重新授予自己的許可權。
可用的許可權是
SELECT
#允許從表、檢視、物化檢視或其他類表物件中的任何列或特定列進行 SELECT
。也允許使用 COPY TO
。在 UPDATE
、DELETE
或 MERGE
中引用現有列值也需要此許可權。對於序列,此許可權還允許使用 currval
函式。對於大物件,此許可權允許讀取物件。
INSERT
#允許向表、檢視等插入新行。可以授予對特定列的許可權,在這種情況下,只能在 INSERT
命令中為這些列賦值(其他列將因此接收預設值)。也允許使用 COPY FROM
。
UPDATE
#允許更新表、檢視等中的任何列或特定列。(實際上,任何非平凡的 UPDATE
命令都需要 SELECT
許可權,因為它必須引用表列來確定要更新哪些行,以及/或計算列的新值。)SELECT ... FOR UPDATE
和 SELECT ... FOR SHARE
也需要至少一列的此許可權,外加 SELECT
許可權。對於序列,此許可權允許使用 nextval
和 setval
函式。對於大物件,此許可權允許寫入或截斷物件。
DELETE
#允許從表、檢視等中刪除行。(實際上,任何非平凡的 DELETE
命令都需要 SELECT
許可權,因為它必須引用表列來確定要刪除哪些行。)
TRUNCATE
#允許對錶執行 TRUNCATE
。
REFERENCES
#允許建立引用表或表的特定列的外部索引鍵約束。
TRIGGER
#允許在表、檢視等上建立觸發器。
CREATE
#對於資料庫,允許在此資料庫中建立新的模式和釋出,並允許在此資料庫中安裝受信任的擴充套件。
對於模式,允許在此模式中建立新物件。要重新命名現有物件,您必須擁有該物件並且擁有包含模式的此許可權。
對於表空間,允許在此表空間中建立表、索引和臨時檔案,並允許建立將此表空間作為其預設表空間建立的資料庫。
請注意,撤銷此許可權不會改變現有物件的存在或位置。
CONNECT
#允許授權物件連線到資料庫。此許可權在連線啟動時檢查(除了檢查 pg_hba.conf
施加的任何限制)。
TEMPORARY
#允許在使用資料庫時建立臨時表。
EXECUTE
#允許呼叫函式或過程,包括使用基於該函式實現的任何運算子。這是適用於函式和過程的唯一許可權型別。
USAGE
#對於過程語言,允許使用該語言建立該語言的函式。這是適用於過程語言的唯一許可權型別。
對於模式,允許訪問模式中包含的物件(假設物件的自身許可權要求也已滿足)。本質上,這允許授權物件“查詢”模式中的物件。沒有此許可權,仍然可以檢視物件名稱,例如,透過查詢系統目錄。此外,撤銷此許可權後,現有會話可能仍有先前執行過此查詢的語句,因此這不是完全安全的防止物件訪問的方法。
對於序列,允許使用 currval
和 nextval
函式。
對於型別和域,允許在建立表、函式和其他模式物件時使用該型別或域。(請注意,此許可權不控制型別的所有“用法”,例如在查詢中出現的型別值。它只阻止建立依賴於該型別的物件。此許可權的主要目的是控制哪些使用者可以建立對型別的依賴關係,這可能會阻止所有者以後更改該型別。)
對於外部資料包裝器,允許使用外部資料包裝器建立新伺服器。
對於外部伺服器,允許使用該伺服器建立外部表。授權物件還可以建立、修改或刪除與該伺服器關聯的自己的使用者對映。
SET
#允許在當前會話中將伺服器配置引數設定為新值。(雖然此許可權可以授予任何引數,但它除了需要超級使用者許可權才能設定的引數外,都沒有意義。)
ALTER SYSTEM
#允許使用 ALTER SYSTEM 命令將伺服器配置引數配置為新值。
MAINTAIN
#允許對關係執行 VACUUM
、ANALYZE
、CLUSTER
、REFRESH MATERIALIZED VIEW
、REINDEX
、LOCK TABLE
以及資料庫物件統計資訊操作函式(請參閱表 9.105)。
其他命令所需的許可權列在該命令的參考頁面上。
PostgreSQL 預設向 PUBLIC
授予某些型別的物件的許可權。預設情況下,不對錶、表列、序列、外部資料包裝器、外部伺服器、大物件、模式、表空間或配置引數授予任何許可權給 PUBLIC
。對於其他型別的物件,授予 PUBLIC
的預設許可權如下:資料庫的 CONNECT
和 TEMPORARY
(建立臨時表)許可權;函式和過程的 EXECUTE
許可權;以及語言和資料型別(包括域)的 USAGE
許可權。當然,物件所有者可以 REVOKE
預設和明確授予的許可權。(為了最大程度的安全,請在建立物件的同一事務中執行 REVOKE
;這樣就不會有其他使用者可以利用該物件的視窗。)此外,可以使用 ALTER DEFAULT PRIVILEGES 命令覆蓋這些預設許可權設定。
在 ACL 值中,表 5.1 顯示了用於這些許可權型別的單字母縮寫。您將在下面列出的 psql 命令的輸出中看到這些字母,或者在檢視ACL系統目錄的列時看到。
表 5.1. ACL許可權縮寫
許可權 | 縮寫 | 適用的物件型別 |
---|---|---|
SELECT |
r (“讀取”) |
LARGE OBJECT 、SEQUENCE 、TABLE (及類表物件)、表列 |
INSERT |
a (“追加”) |
TABLE 、表列 |
UPDATE |
w (“寫入”) |
LARGE OBJECT 、SEQUENCE 、TABLE 、表列 |
DELETE |
d |
TABLE |
TRUNCATE |
D |
TABLE |
REFERENCES |
x |
TABLE 、表列 |
TRIGGER |
t |
TABLE |
CREATE |
C |
DATABASE 、SCHEMA 、TABLESPACE |
CONNECT |
c |
DATABASE |
TEMPORARY |
T |
DATABASE |
EXECUTE |
X |
FUNCTION 、PROCEDURE |
USAGE |
U |
DOMAIN 、FOREIGN DATA WRAPPER 、FOREIGN SERVER 、LANGUAGE 、SCHEMA 、SEQUENCE 、TYPE |
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+ |
FUNCTION 或 PROCEDURE |
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
擁有授予選項(*
)的 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
的某些許可權,如上所述。物件上的第一個 GRANT
或 REVOKE
將例項化預設許可權(例如,生成 miriam=arwdDxt/miriam
),然後根據指定的要求進行修改。同樣,僅當列的許可權非預設時,“列許可權”才會顯示條目。(注意:為此目的,“預設許可權”始終指物件的內建預設許可權。受 ALTER DEFAULT PRIVILEGES
命令影響的物件的許可權將始終顯示具有顯式許可權條目,其中包括 ALTER
的效果。)
請注意,所有者隱式的授予選項未在訪問許可權顯示中標記。只有當授予選項明確授予某人時,才會出現“*
”。
“訪問許可權”列在物件的許可權條目非 null 但為空時顯示 (none)
。這意味著根本沒有授予任何許可權,甚至沒有授予物件的所有者——這種情況很少見。(在這種情況下,所有者仍然擁有隱式的授予選項,因此可以重新授予自己的許可權;但她目前沒有任何許可權。)
如果您在文件中看到任何不正確的內容,與您對特定功能的體驗不符,或者需要進一步澄清,請使用此表單報告文件問題。