W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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)系。這些變體在很多方面都相似,但是也有很多不同,所以還是得分別描述它們。
這種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
命令的這種變體把一個(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è)表擁有者可以通過撤回其自身擁有 的INSERT
、UPDATE
、DELETE
和TRUNCATE
特權(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)SELECT
和UPDATE
是 PostgreSQL
擴(kuò)展。應(yīng)用序列的USAGE
特權(quán)到currval
函數(shù)也是一個(gè) PostgreSQL 擴(kuò)展(該函數(shù)本身也是)。
數(shù)據(jù)庫、表空間、模式和語言上的特權(quán)都是PostgreSQL擴(kuò)展。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: