當建立一個物件時,會被指定一個擁有者。擁有者通常是執行建立語句的角色。對於大多數類型的物件,初始狀態是只有擁有者(或超級使用者)才能對該物件執行任何操作。要允許其他角色使用它,必須授予權限。
有不同種類的權限: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
到表、檢視表等。 可以授予特定欄位,在這種情況下,只有這些欄位可以在 INSERT
命令中被賦值(因此其他欄位將收到預設值)。 也允許使用 COPY FROM
。
UPDATE
#允許對資料表、檢視表等物件的任何欄位或特定欄位執行 UPDATE
指令。(實際上,任何重要的 UPDATE
指令都需要 SELECT
權限,因為它必須引用資料表欄位才能判斷要更新哪些列,以及/或計算欄位的新值。)SELECT ... FOR UPDATE
和 SELECT ... FOR SHARE
也至少需要在一個欄位上擁有此權限,此外還需要 SELECT
權限。對於序列,此權限允許使用 nextval
和 setval
函式。對於大型物件,此權限允許寫入或截斷物件。
DELETE
#允許從資料表、檢視表等物件中 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
指令。
其他指令所需的權限列在相應指令的參考頁面上。
PostgreSQL 在建立物件時,預設會將某些物件類型的權限授予 PUBLIC
。 預設情況下,不會將任何權限授予 PUBLIC
給資料表、資料表欄位、序列、外部資料包裝器、外部伺服器、大型物件、結構描述、表空間或組態參數。 對於其他類型的物件,預設授予 PUBLIC
的權限如下:資料庫的 CONNECT
和 TEMPORARY
(建立暫存資料表)權限;函式和程序的 EXECUTE
權限;以及語言和資料類型(包括域)的 USAGE
權限。 物件所有者當然可以 REVOKE
預設和明確授予的權限。(為了獲得最大安全性,請在建立物件的同一個交易中發出 REVOKE
;這樣就不會有其他使用者可以使用該物件的時間窗口。) 此外,這些預設權限設定可以使用 ALTER DEFAULT PRIVILEGES 指令覆寫。
表 5.1 顯示了在 ACL(存取控制列表)值中用於這些權限類型的一個字母縮寫。您將在下面列出的 psql 指令的輸出中看到這些字母,或者在查看系統目錄的 ACL 欄位時看到它們。
表 5.1。ACL 權限縮寫
權限 | 縮寫 | 適用的物件類型 |
---|---|---|
SELECT |
r (「讀取」) |
LARGE OBJECT 、SEQUENCE 、TABLE (和類似資料表的物件)、資料表欄位 |
INSERT |
a (「追加」) |
TABLE ,資料表欄位 |
UPDATE(更新) |
w (「write(寫入)」) |
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 |
A |
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 |
資料表欄位 | 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
的效果。)
請注意,擁有者的隱含授予選項未在存取權限顯示中標記。*
僅當已明確授予某人授予選項時才會顯示。
當物件的權限條目非空但為空時,「存取權限」欄位顯示 (none)
。這表示根本沒有授予任何權限,即使是對物件的擁有者也是如此 — 這是一種罕見的情況。(在這種情況下,擁有者仍然具有隱含的授予選項,因此可以重新授予她自己的權限;但她目前沒有任何權限。)
如果您在文件中發現任何不正確、與特定功能的體驗不符或需要進一步澄清的地方,請使用此表格來報告文件問題。