PostgreSQL GRANT

2021-09-10 16:51 更新

GRANT — 定義訪問特權(quán)

大綱

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
    [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
    ON [ TABLE ] table_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { SEQUENCE sequence_name [, ...]
         | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON DOMAIN domain_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN DATA WRAPPER fdw_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN SERVER server_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { { FUNCTION | PROCEDURE | ROUTINE } routine_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
         | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE lang_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECT loid [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespace_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON TYPE type_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

其中role_specification可以是:

    [ GROUP ] role_name
  | PUBLIC
  | CURRENT_USER
  | SESSION_USER

GRANT role_name [, ...] TO role_name [, ...] [ WITH ADMIN OPTION ]

描述

GRANT命令由兩種基本的變體:一種授予在一個(gè)數(shù)據(jù)庫對(duì)象(表、列、視圖、外部表、序列、數(shù)據(jù)庫、外部數(shù)據(jù)包裝器、外部服務(wù)器、函數(shù)、過程、過程語言、模式或表空間)上的特權(quán),另一個(gè)授予一個(gè)角色中的成員關(guān)系。這些變體在很多方面都相似,但是也有很多不同,所以還是得分別描述它們。

在數(shù)據(jù)庫對(duì)象上 GRANT

這種GRANT命令的變體將一個(gè)數(shù)據(jù)庫對(duì)象上的指定特權(quán)交給一個(gè)或多個(gè)角色。如果有一些已經(jīng)被授予,這些特權(quán)會(huì)被加入到它們之中。

關(guān)鍵詞PUBLIC指示特權(quán)要被授予給所有角色,包括那些可能稍后會(huì)被創(chuàng)建的角色。PUBLIC可以被認(rèn)為是一個(gè)被隱式定義的總是包含所有角色的組。任何特定角色都將具有直接授予給它的特權(quán)、授予給它作為成員所在的任何角色的特權(quán)以及被授予給PUBLIC的特權(quán)。

如果指定了WITH GRANT OPTION,特權(quán)的接收者可以接著把它授予給其他人。如果沒有授權(quán)選項(xiàng),接收者就不能這樣做。授權(quán)選項(xiàng)不能被授予給PUBLIC。

沒有必要把權(quán)限授予給一個(gè)對(duì)象的擁有者(通常就是創(chuàng)建該對(duì)象的用戶), 因?yàn)閾碛姓吣J(rèn)具有所有的特權(quán)(不過擁有者可能為了安全選擇撤回一些 它們自己的特權(quán))。

刪除一個(gè)對(duì)象或者以任何方式修改其定義的權(quán)力是不被當(dāng)作一個(gè)可授予特權(quán)的,它被固化在擁有者中,并且不能被授予和撤回(不過,相似地效果可以通過授予或者撤回在擁有該對(duì)象的角色中的成員關(guān)系來實(shí)現(xiàn),見下文)。擁有者也隱式地?fù)碛性搶?duì)象的所有授權(quán)選項(xiàng)。

The possible privileges are:

SELECT
INSERT
UPDATE
DELETE
TRUNCATE
REFERENCES
TRIGGER
CREATE
CONNECT
TEMPORARY
EXECUTE
USAGE

特定類型的權(quán)限,如 第 5.7 節(jié)中所定義。

TEMP

TEMPORARY的替代拼寫。

ALL PRIVILEGES

授予對(duì)象的類型可用的所有權(quán)限。PRIVILEGES關(guān)鍵詞在PostgreSQL中是可選的,盡管它是嚴(yán)格的 SQL 所需要的。

FUNCTION語法適用于簡(jiǎn)單函數(shù)、聚合函數(shù)和窗口函數(shù),但不適用于過程;對(duì)過程使用PROCEDURE。 或者,使用ROUTINE來引用函數(shù)、聚合函數(shù)、窗口函數(shù)或過程而不管其精確類型。

還有一個(gè)選項(xiàng),可以在一個(gè)或多個(gè)模式中對(duì)所有相同類型的對(duì)象授予特權(quán)。此功能當(dāng)前僅支持表、序列、函數(shù)和過程。 ALL TABLES也會(huì)影響視圖和外表,就像特定對(duì)象 GRANT命令。 ALL FUNCTIONS也會(huì)影響聚合和窗口函數(shù),但不影響過程,就像特定對(duì)象GRANT命令一樣。 使用 ALL ROUTINES 來包括過程。

角色上的 GRANT

GRANT命令的這種變體把一個(gè)角色中的成員關(guān)系授予一個(gè)或者多個(gè)其他角色。一個(gè)角色中的成員關(guān)系是有意義的,因?yàn)樗鼤?huì)把授予給一個(gè)角色的特權(quán)帶給該角色的每一個(gè)成員。

如果指定了WITH ADMIN OPTION,成員接著可以把該角色中的成員關(guān)系授予給其他用戶,也可以撤回該角色中的成員關(guān)系。如果沒有管理選項(xiàng),普通用戶就不能做這些工作。一個(gè)角色不被認(rèn)為持有自身的WITH ADMIN OPTION,但是它可以從一個(gè)會(huì)話用戶匹配該角色的數(shù)據(jù)庫會(huì)話中授予或撤回自身中的成員關(guān)系。數(shù)據(jù)庫超級(jí)用戶能夠授予或撤回任何角色中任何人的成員關(guān)系。具有CREATEROLE特權(quán)的角色能夠授予或者撤回任何非超級(jí)用戶角色中的成員關(guān)系。

如果指定了GRANTED BY,則該授予被記錄為已由指定角色完成。 只有數(shù)據(jù)庫超級(jí)用戶可以使用此選項(xiàng),除非它為執(zhí)行命令指定了相同的角色。

和特權(quán)的情況不同,一個(gè)角色中的成員關(guān)系不能被授予PUBLIC。還要注意 這種形式的命令不允許role_specification 中的噪聲詞GROUP。

注解

REVOKE命令被用來撤回訪問特權(quán)。

PostgreSQL 8.1 開始,用戶和組的概念已經(jīng)被統(tǒng)一到一種單一類型的實(shí)體(被稱為一個(gè)角色)。因此不再需要使用關(guān)鍵詞GROUP來標(biāo)識(shí)一個(gè)被授權(quán)者是一個(gè)用戶或者一個(gè)組。在該命令中仍然允許GROUP,但是它只是一個(gè)噪音詞而已。

如果一個(gè)用戶持有特定列或者其所在的整個(gè)表的特權(quán), 該用戶可以在該列上執(zhí)行SELECT、 INSERT等命令。在表層面上授予特權(quán) 然后對(duì)一列撤回該特權(quán)將不會(huì)按照你希望的運(yùn)作: 表級(jí)別的授權(quán)不會(huì)受到列級(jí)別操作的影響。

當(dāng)一個(gè)對(duì)象的非擁有者嘗試GRANT該對(duì)象上的特權(quán),如果該用戶在該對(duì)象上什么特權(quán)都不擁有,該命令將立刻失敗。只要有一些特權(quán)可用,該命令將繼續(xù),但是它將只授予那些用戶具有授權(quán)選項(xiàng)的特權(quán)。如果不持有授權(quán)選項(xiàng),GRANT ALL PRIVILEGES形式將發(fā)出一個(gè)警告消息。而如果不持有命令中特別提到的任何特權(quán)的授權(quán)選項(xiàng),其他形式將會(huì)發(fā)出一個(gè)警告(原則上這些語句也適用于對(duì)象擁有者,但是由于擁有者總是被視為持有所有授權(quán)選項(xiàng),因此這種情況不會(huì)發(fā)生)。

需要注意的是,數(shù)據(jù)庫超級(jí)用戶可以訪問所有對(duì)象而不管對(duì)象特權(quán)的設(shè)置。這可與 Unix 系統(tǒng)中的root權(quán)力相提并論。對(duì)于root來說,除非絕對(duì)必要,使用一個(gè)超級(jí)用戶來操作是不明智的。

如果一個(gè)超級(jí)用戶選擇發(fā)出一個(gè)GRANT或者REVOKE命令,該命令將被執(zhí)行,好像它是由被影響對(duì)象的擁有者發(fā)出的一樣。特別地,通過這樣一個(gè)命令授予的特權(quán)將好像是由對(duì)象擁有者授予的一樣(對(duì)于角色成員關(guān)系,該成員關(guān)系好像是由該角色本身授予的一樣)。

GRANT以及REVOKE也可以由一個(gè)不是受影響對(duì)象擁有者的角色完成,不過該角色是擁有該對(duì)象的角色的一個(gè)成員,或者是在該對(duì)象上持有特權(quán)的WITH GRANT OPTION的角色的一個(gè)成員。在這種情況下,特權(quán)將被記錄為由實(shí)際擁有該對(duì)象的角色授予或者是由持有特權(quán)的WITH GRANT OPTION的角色授予。例如,如果表 t1被角色g1擁有,u1是它的一個(gè)成員,那么u1可以把t1上的特權(quán)授予給u2,但是那些特權(quán)將好像是直接由g1授予的。角色g1的任何其他成員可以稍后撤回它們。

如果執(zhí)行GRANT的角色間接地通過多于一條角色成員關(guān)系路徑持有所需的特權(quán),將不會(huì)指定哪一個(gè)包含它的角色將被記錄為完成了該授權(quán)。在這樣的情況中,最好使用SET ROLE來成為你想用其做GRANT的特定角色。

授予一個(gè)表上的權(quán)限不會(huì)自動(dòng)地?cái)U(kuò)展權(quán)限給該表使用的任何序列,包括綁定在SERIAL列上的序列。序列上的權(quán)限必須被獨(dú)立設(shè)置。

有關(guān)特定的特權(quán)類型以及如何檢查對(duì)象特權(quán)的更多信息,請(qǐng)參見第 5.7 節(jié)

例子

把表films上的插入特權(quán)授予給所有用戶:

GRANT INSERT ON films TO PUBLIC;

把視圖kinds上的所有可用特權(quán)授予給用戶manuel

GRANT ALL PRIVILEGES ON kinds TO manuel;

注意雖然上述語句被一個(gè)超級(jí)用戶或者kinds的擁有者執(zhí)行時(shí)確實(shí)會(huì)授予所有特權(quán),但是當(dāng)由其他人執(zhí)行時(shí)將只會(huì)授予那些執(zhí)行者擁有授權(quán)選項(xiàng)的權(quán)限。

把角色admins中的成員關(guān)系授予給用戶joe

GRANT admins TO joe;

兼容性

根據(jù) SQL 標(biāo)準(zhǔn),ALL PRIVILEGES中的PRIVILEGES關(guān)鍵詞是必須的。SQL 標(biāo)準(zhǔn)不支持在每個(gè)命令中設(shè)置超過一個(gè)對(duì)象上的特權(quán)。

PostgreSQL允許一個(gè)對(duì)象擁有者 撤回它們擁有的普通特權(quán):例如,一個(gè)表擁有者可以通過撤回其自身擁有 的INSERTUPDATE、DELETETRUNCATE特權(quán)讓該表對(duì)它們自己只讀。根據(jù) SQL 標(biāo)準(zhǔn) 這是不可能發(fā)生的。原因在于PostgreSQL 認(rèn)為擁有者的特權(quán)是由擁有者授予給它們自己的,因此它們也能夠撤回它們。 在 SQL 標(biāo)準(zhǔn)中,擁有者的特權(quán)是有一個(gè)假設(shè)的實(shí)體_SYSTEM所授予。 由于不是_SYSTEM,擁有者就不能撤回這些權(quán)力。

根據(jù) SQL 標(biāo)準(zhǔn),授權(quán)選項(xiàng)可以被授予給PUBLIC, PostgreSQL 只支持把授權(quán)選項(xiàng)授予給角色。

The SQL standard allows the GRANTED BY option to be used in all forms of GRANT. PostgreSQL only supports it when granting role membership, and even then only superusers may use it in nontrivial ways. SQL標(biāo)準(zhǔn)允許在所有形式的GRANT中使用GRANTED BY選項(xiàng)。 PostgreSQL只在授予角色成員資格時(shí)才支持該選項(xiàng),即使這樣,也只有超級(jí)用戶才能以非平凡的方式使用它。

SQL 標(biāo)準(zhǔn)提供了其他對(duì)象類型上的USAGE特權(quán):字符集、排序規(guī)則、翻譯。

在 SQL 標(biāo)準(zhǔn)中,序列只有一個(gè)USAGE特權(quán),它控制NEXT VALUE FOR表達(dá)式的使用,該表達(dá)式等效于 PostgreSQL 中的函數(shù)nextval。序列的特權(quán)SELECTUPDATE是 PostgreSQL 擴(kuò)展。應(yīng)用序列的USAGE特權(quán)到currval函數(shù)也是一個(gè) PostgreSQL 擴(kuò)展(該函數(shù)本身也是)。

數(shù)據(jù)庫、表空間、模式和語言上的特權(quán)都是PostgreSQL擴(kuò)展。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)