?
このドキュメントでは、 php中國(guó)語ネットマニュアル リリース
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column [, ...] ) [,...] | ALL [ PRIVILEGES ] ( column [, ...] ) } ON [ TABLE ] table_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { USAGE | SELECT | UPDATE } [,...] | ALL [ PRIVILEGES ] } ON { SEQUENCE sequence_name [, ...] | ALL SEQUENCES IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE database_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPER fdw_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVER server_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION function_name ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE lang_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { SELECT | UPDATE } [,...] | ALL [ PRIVILEGES ] } ON LARGE OBJECT loid [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schema_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE tablespace_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT role_name [, ...] TO role_name [, ...] [ WITH ADMIN OPTION ]
GRANT命令有兩個(gè)基本變種:一個(gè)變種是給數(shù)據(jù)庫對(duì)象(表、字段、視圖、序列、數(shù)據(jù)庫、foreign-data wrapper、foreign server、函數(shù)、 過程語言、模式、表空間)賦予權(quán)限;一個(gè)變種是賦予一個(gè)角色中的成員關(guān)系。 這些變種在很多方面都非常類似,但是它們之間的區(qū)別也有足夠理由來分開描述。
這個(gè)變種的GRANT命令在數(shù)據(jù)庫對(duì)象上給一個(gè)或多個(gè)角色授予特定的權(quán)限。這些權(quán)限追加到已經(jīng)授予的權(quán)限上。
也有一個(gè)選項(xiàng)是將權(quán)限授予一個(gè)或者兩個(gè)模式內(nèi)的名稱類型的所有對(duì)象。該功能目前僅支持 表、序列和函數(shù)(請(qǐng)注意 ALL TABLES被認(rèn)為是包括視圖的)。
關(guān)鍵字PUBLIC表示該權(quán)限要賦予所有角色,包括那些以后可能創(chuàng)建的用戶。 PUBLIC可以看做是一個(gè)隱含定義好的組, 它總是包括所有角色。任何特定的角色都將擁有直接賦予他/它的權(quán)限,加上他/它所處的任何組, 以及再加上賦予PUBLIC的權(quán)限的總和。
如果聲明了WITH GRANT OPTION,那么權(quán)限的接收者也可以將此權(quán)限賦予他人, 否則就不能授權(quán)他人。這個(gè)選項(xiàng)不能賦予PUBLIC。
沒必要將權(quán)限授予一個(gè)對(duì)象的所有者(通常是創(chuàng)建它的用戶),因?yàn)樗姓呷笔【统钟兴袡?quán)限。 (不過,所有者出于安全考慮可以選擇廢棄一些他自己的權(quán)限。)
刪除一個(gè)對(duì)象的權(quán)力,或者是任意修改它的權(quán)力都不是可賦予的權(quán)限;它是創(chuàng)建者固有的, 并且不能賦予或撤銷。( 然而,授予或撤銷擁有對(duì)象的角色的成員關(guān)系可以獲得相似的效果; 請(qǐng)看下面的。)所有者也隱含地?fù)碛性搶?duì)象的所有授權(quán)選項(xiàng)。
根據(jù)對(duì)象的不同,初始的缺省權(quán)限包括一些賦予PUBLIC的權(quán)限:對(duì)于表、字段、模式、表空間沒有公開訪問權(quán)限; 對(duì)于數(shù)據(jù)庫有CONNECT權(quán)限和創(chuàng)建TEMP表的權(quán)限;對(duì)于函數(shù)有EXECUTE權(quán)限;對(duì)于語言有USAGE權(quán)限。 對(duì)象所有者當(dāng)然可以撤回這些權(quán)限。出于最大安全性考慮, 在創(chuàng)建該對(duì)象的同一個(gè)事務(wù)中發(fā)出REVOKE就不會(huì)打開給別的用戶使用該對(duì)象的窗口。 同時(shí),這些初始的默認(rèn)權(quán)限設(shè)置可以通過使用ALTER DEFAULT PRIVILEGES 命令來設(shè)置。
可能的權(quán)限有:
允許來自列,或者特定表列出的特定列。視圖或者序列的SELECT。
也允許使用COPY。該權(quán)限也需要參考在UPDATE或者
DELETE中的既有列值。例如,該權(quán)限也允許使用
currval
函數(shù)。對(duì)于大對(duì)象,該權(quán)限允許讀對(duì)象。
允許一個(gè)新行的INSERT插入特定表中。如果特定列被列出, 僅僅那些指定的列可以被分配在INSERT命令中(而其他列會(huì)收到默認(rèn)值)。 也允許COPY FROM。
允許任意列的UPDATE,或者特定表列出的特定列。
(實(shí)際上,任意非平凡UPDATE命令也將請(qǐng)求SELECT權(quán)限,
因?yàn)楸仨殔⒖急砹幸源_定更新哪些行,和/或?yàn)榱杏?jì)算新值。)SELECT ... FOR UPDATE
和SELECT ... FOR SHARE也在至少一列上請(qǐng)求該權(quán)限,
比如,該權(quán)限允許nextval
和setval
函數(shù)的使用。
對(duì)于大對(duì)象,該權(quán)限允許寫或者截該對(duì)象。
允許來自特定列的一行的DELETE。 (實(shí)際上,任意非平凡DELETE命令也將請(qǐng)求 SELECT權(quán)限, 因?yàn)楸仨殔⒖急砹衼頉Q定刪除哪一行)。
允許特定表上的TRUNCATE。
為了創(chuàng)建外鍵約束,有必要在參照列和被參照列都有該權(quán)限。該權(quán)限可以授予 一個(gè)表的所有列或者僅僅是特定列。
允許在聲明表上創(chuàng)建觸發(fā)器(參見CREATE TRIGGER語句)。
對(duì)于數(shù)據(jù)庫,允許在該數(shù)據(jù)庫里創(chuàng)建新的模式。
對(duì)于模式,允許在該模式中創(chuàng)建新的對(duì)象。要重命名一個(gè)現(xiàn)有對(duì)象,你必需擁有該對(duì)象并且對(duì)包含該對(duì)象的模式擁有這個(gè)權(quán)限。
對(duì)于表空間,允許在其中創(chuàng)建表,索引,和臨時(shí)文件的時(shí)候把該表空間指定為其缺省表空間。 請(qǐng)注意,撤銷這個(gè)權(quán)限不會(huì)改變現(xiàn)有數(shù)據(jù)庫和模式的存放位置。
允許用戶連接到指定的數(shù)據(jù)庫。該權(quán)限將在連接啟動(dòng)時(shí)檢查(除了檢查 pg_hba.conf中的任何限制之外)。
允許在使用指定數(shù)據(jù)庫的時(shí)候創(chuàng)建臨時(shí)表。
允許使用指定的函數(shù)并且可以使用任何利用這些函數(shù)實(shí)現(xiàn)的操作符。這是適用于 函數(shù)的唯一權(quán)限。該語法同樣適用于聚集函數(shù)。
對(duì)于過程語言,允許使用指定過程語言創(chuàng)建該語言的函數(shù)。這是適用于過程語言的唯一權(quán)限。
對(duì)于模式,允許訪問包含在指定模式中的對(duì)象(假設(shè)該對(duì)象的所有權(quán)要求同樣也設(shè)置了)。 最終這些就允許了權(quán)限接受者"查詢"模式中的對(duì)象。沒有這個(gè)權(quán)限仍然可以 看見這些對(duì)象的名字(比如通過查詢系統(tǒng)視圖)。 同樣,撤銷該權(quán)限之后,現(xiàn)有的后端可能有在查找之前就執(zhí)行了的語句,因此這不是一個(gè) 很安全的限制對(duì)象訪問的方法。
對(duì)于序列,該權(quán)限允許使用currval
和nextval
函數(shù)。
對(duì)于外部數(shù)據(jù)封裝器,該特權(quán)確保承受者使用外部數(shù)據(jù)封裝器創(chuàng)建新服務(wù)器。
對(duì)于服務(wù)器,該權(quán)限確保承受者能創(chuàng)建、更改和刪除與那個(gè)服務(wù)器關(guān)聯(lián)的 其自身用戶的用戶映射。另外,確保承受者查詢服務(wù)器選項(xiàng)并聯(lián)合用戶映射。
一次性給予所有可以賦予的權(quán)限。PRIVILEGES關(guān)鍵字在 PostgreSQL里是可選的,但是嚴(yán)格的SQL要求有這個(gè)關(guān)鍵字。
其它命令要求的權(quán)限都在相應(yīng)的命令的參考頁上列出。
這個(gè)變種的GRANT命令把一個(gè)角色的成員關(guān)系賦予一個(gè)或多個(gè)其它角色。 角色里的成員關(guān)系很重要, 因?yàn)樗鼤?huì)將賦予該角色的權(quán)限傳播給所有該角色的成員。
如果聲明了WITH ADMIN OPTION,那么該成員隨后就可以將角色的成員 關(guān)系賦予其它角色,以及撤銷其它角色的成員關(guān)系。如果沒有admin選項(xiàng),普通用戶就不能 這么做。不過,數(shù)據(jù)庫超級(jí)用戶可以給任何人賦與或者撤銷任何角色的任何成員關(guān)系。 擁有CREATEROLE權(quán)限的角色可以賦予或者撤銷任何非超級(jí)用戶角色的成員關(guān)系。
與權(quán)限不同,角色的成員關(guān)系不能被賦予PUBLIC。需要注意的是, 這種形式的命令不允許使用無意義的GROUP關(guān)鍵字。
REVOKE命令用于刪除訪問權(quán)限。
自PostgreSQL8.1,用戶和群組的概念已經(jīng)被到統(tǒng)一到 一個(gè)稱作角色的單一類型的實(shí)體。因此,不再需要使用關(guān)鍵字GROUP來 確認(rèn)被授權(quán)者是一個(gè)用戶還是一個(gè)用戶。GROUP在命令中仍然允許, 但這是一個(gè)噪音碼字。
一個(gè)用戶可能在一列上執(zhí)行SELECT, INSERT等等,若該用戶 持有對(duì)指定列或者其整個(gè)表的權(quán)限。在表級(jí)別授予權(quán)限并且之后對(duì)一列撤銷權(quán)限,這可能 無法達(dá)成您的希望:表級(jí)別的授權(quán)是不受列級(jí)別操作的影響。
如果非對(duì)象所有者企圖在對(duì)象上GRANT權(quán)限,而該用戶沒有該對(duì)象上指定的權(quán)限, 那么命令將立即失敗。 只要有某些可用的權(quán)限,該命令就會(huì)繼續(xù),但是它只授予那些該用戶有授權(quán)選項(xiàng)的權(quán)限。 如果沒有可用的授權(quán)選項(xiàng),那么GRANT ALL PRIVILEGES形式將發(fā)出一個(gè)警告信息, 其它命令形式將發(fā)出在命令中提到的、但是沒有授權(quán)選項(xiàng)的那些權(quán)限相關(guān)的警告信息。 這些語句原則上也適用于對(duì)象所有者,但是因?yàn)樗姓呖偸潜徽J(rèn)為擁有所有授權(quán)選項(xiàng), 所以這種情況永遠(yuǎn)不會(huì)發(fā)生在所有者身上。
要注意數(shù)據(jù)庫超級(jí)用戶可以訪問所有對(duì)象,而不會(huì)受對(duì)象的權(quán)限設(shè)置影響。這個(gè)特點(diǎn)類似 Unix系統(tǒng)的root的權(quán)限。 和root一樣,除了必要的情況,總是以超級(jí)用戶身份進(jìn)行操作是不明智的做法。
如果一個(gè)超級(jí)用戶選擇發(fā)出一個(gè)GRANT或REVOKE命令,那么這條命 令將是以被影響對(duì)象的所有者的形式執(zhí)行的。特別是,通過這種方法賦與的權(quán)限將顯得好像是 由對(duì)象所有者賦與的。對(duì)于角色成員關(guān)系,成員關(guān)系的賦與就會(huì)像是通過包含角色自己賦與的一樣。
GRANT和REVOKE也可以不由被影響對(duì)象的所有者來執(zhí)行,而是由擁有 該對(duì)象的角色的一個(gè)成員來執(zhí)行, 或者是一個(gè)在該對(duì)象上持有WITH GRANT OPTION權(quán)限的角色的成員。在這種 情況下,該權(quán)限將被紀(jì)錄為是由實(shí)際擁有該對(duì)象或者持有WITH GRANT OPTION 權(quán)限的對(duì)象賦與的。比如,如果表t1被角色g1擁有,并且u1 是g1的一個(gè)成員,然后u1可以把t1的權(quán)限賦予u2, 但是這些權(quán)限將表現(xiàn)為是由g1直接賦予的。任何g1角色的成員都可以在之后撤銷這些權(quán)限。
如果執(zhí)行GRANT的角色所持有的所需權(quán)限是通過角色成員關(guān)系間接獲得的, 那么究竟是那個(gè)角色將被紀(jì)錄為賦予權(quán)限的角色就是未知的。在這種情況下, 最好的方法是使用SET ROLE成為你想執(zhí)行GRANT命令的指定角色。
在一個(gè)表上授權(quán)許可不會(huì)自動(dòng)擴(kuò)展許可到任何表使用的序列,包括關(guān)聯(lián)到SERIAL列上的 序列。序列上的權(quán)限必須另行設(shè)置。
使用psql's \dp命令 來獲取關(guān)于對(duì)表和列的現(xiàn)有權(quán)限的信息。例如:
=> \dp mytable Access privileges Schema | Name | Type | Access privileges | Column access privileges --------+---------+-------+-----------------------+-------------------------- public | mytable | table | miriam=arwdDxt/miriam | col1: : =r/miriam : miriam_rw=rw/miriam : admin=arw/miriam (1 row)
\dp顯示的條目會(huì)被這樣解釋執(zhí)行:
rolename=xxxx -- privileges granted to a role =xxxx -- privileges granted to PUBLIC r -- SELECT ("read") w -- UPDATE ("write") a -- INSERT ("append") d -- DELETE D -- TRUNCATE x -- REFERENCES t -- TRIGGER X -- EXECUTE U -- USAGE C -- CREATE c -- CONNECT T -- TEMPORARY arwdDxt -- ALL PRIVILEGES (for tables, varies for other objects) * -- grant option for preceding privilege /yyyy -- role that granted this privilege
用戶miriam在建完mytable表之后再做下面的語句,就可以得到上面 例子的結(jié)果:
GRANT SELECT ON mytable TO PUBLIC; GRANT SELECT, UPDATE, INSERT ON mytable TO admin; GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;
對(duì)于非表對(duì)象有可以顯示其權(quán)限的其他\d命令。
若"Access privileges"列對(duì)于給定對(duì)象是空的,這意味著對(duì)象有默認(rèn)權(quán)限(也就是說, 其權(quán)限列是空的)。默認(rèn)權(quán)限總是包括對(duì)所有者的所有權(quán)限,并且包含依賴對(duì)象類型的 一些對(duì)PUBLIC的權(quán)限,如上所述。 一個(gè)對(duì)象上的第一個(gè)GRANT或者REVOKE將實(shí)例化默認(rèn)的特權(quán) (生產(chǎn),例如{miriam=arwdDxt/miriam})并且然后根據(jù)每個(gè)特定請(qǐng)求來 更改他們。類似地,條目?jī)H僅對(duì)于沒有非默認(rèn)權(quán)限的列顯示"Column access privileges"。 權(quán)限受ALTER DEFAULT PRIVILEGES命令影響的對(duì)象總是顯示為帶有包含 ALTER影響的顯式權(quán)限條目。
請(qǐng)注意所有者的隱含授權(quán)選項(xiàng)沒有在顯示出來的訪問權(quán)限里標(biāo)記出來。只有在授權(quán)選項(xiàng)明確 地授予某人之后,才會(huì)顯示一個(gè)*。
把表films的插入權(quán)限賦予所有用戶:
GRANT INSERT ON films TO PUBLIC;
賦予用戶manuel對(duì)視圖kinds的所有權(quán)限:
GRANT ALL PRIVILEGES ON kinds TO manuel;
請(qǐng)注意,如果上面的命令由超級(jí)用戶或者kinds的所有者執(zhí)行, 那么它實(shí)際上會(huì)賦予所有權(quán)限,如果由其他人執(zhí)行,那么它會(huì)賦予這個(gè)"其他人"擁有 授權(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)不支持在一條命令里對(duì)多個(gè)表設(shè)置權(quán)限。
PostgreSQL允許一個(gè)對(duì)象所有者撤銷它自己的普通權(quán)限: 比如,一個(gè)表所有者可以讓自己對(duì)這個(gè)表是只讀的,方法是撤銷自己的INSERT, UPDATE,DELETE權(quán)限。根據(jù)SQL標(biāo)準(zhǔn), 這是不可能的。原因是PostgreSQL把所有者的權(quán)限當(dāng)作 由所有者給自己賦予的;因此也可以撤銷他們。在SQL標(biāo)準(zhǔn)里,所有者的權(quán)限是假設(shè)為 "_SYSTEM"實(shí)體賦予的。因?yàn)樗姓卟皇?span id="377j5v51b" class="QUOTE">"_SYSTEM",所以他不能撤銷這些權(quán)限。
SQL 標(biāo)準(zhǔn)對(duì)其它類型的對(duì)象提供了一個(gè) USAGE 權(quán)限:字符集、??薄⑥D(zhuǎn)換、域。
在數(shù)據(jù)庫、表空間、模式、語言、序列上的權(quán)限是PostgreSQL擴(kuò)展。