?
This document uses PHP Chinese website manual Release
CREATE ROLE name [ [ WITH ] option [ ... ] ]
這里的option可以是:
SUPERUSER | NOSUPERUSER
| CREATEDB | NOCREATEDB
| CREATEROLE | NOCREATEROLE
| CREATEUSER | NOCREATEUSER
| INHERIT | NOINHERIT
| LOGIN | NOLOGIN
| CONNECTION LIMIT connlimit
| [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
| VALID UNTIL 'timestamp'
| IN ROLE role_name [, ...]
| IN GROUP role_name [, ...]
| ROLE role_name [, ...]
| ADMIN role_name [, ...]
| USER role_name [, ...]
| SYSID uid
CREATE ROLE向一個數(shù)據(jù)庫集群添加一個新角色。 一個角色是一個可以擁有數(shù)據(jù)庫對象并且擁有數(shù)據(jù)庫權(quán)限的紀(jì)錄; 角色可以認(rèn)為是一個 "用戶"、一個"組"、或者是兩者兼有。 請參考Chapter 20和Chapter 19獲得有關(guān)管理用戶和權(quán)限的信息。 要使用這條命令,你必須擁有CREATEROLE權(quán)限或者是數(shù)據(jù)庫超級用戶。
請注意角色是在數(shù)據(jù)庫集群的范疇里定義的,因此對數(shù)據(jù)庫集群里的所有數(shù)據(jù)庫都有效。
新角色的名稱
這些子句決定一個新角色是否為"超級用戶", 這種用戶可以超越數(shù)據(jù)庫中的所有訪問權(quán)限。超級用戶狀態(tài)是非常危險(xiǎn)的, 除非真正需要,否則不應(yīng)該使用。如果沒有聲明, 你自己必須是一個超級用戶才能創(chuàng)建一個新的超級用戶。 如果沒有指定,NOSUPERUSER將是缺省。
這些子句定義一個角色是否能創(chuàng)建數(shù)據(jù)庫。 如果聲明了CREATEDB,那么正在創(chuàng)建的角色可以創(chuàng)建新數(shù)據(jù)庫。 聲明NOCREATEDB將不會賦與新角色創(chuàng)建數(shù)據(jù)庫的能力。 如果沒有聲明,那么缺省是NOCREATEDB
這些子句決定一個角色是否可以創(chuàng)建新角色(也就是執(zhí)行 CREATE ROLE)。 一個擁有CREATEROLE權(quán)限的角色也可以修改和刪除其它角色。 如果沒有聲明,缺省是NOCREATEROLE。
這些子句已經(jīng)過時了,但是仍然接受,拼法為 SUPERUSER和NOSUPERUSER。 請注意它們并不等于CREATEROLE!人們很可能輕易地這么認(rèn)為。
這些子句決定一個角色是否"繼承"它所在組的角色的權(quán)限。 一個帶有INHERIT屬性的角色可以自動使用已經(jīng)賦與它直接或間接所在組的任何權(quán)限。 沒有INHERIT, 其它角色的成員關(guān)系只賦與該角色SET ROLE成其它角色的能力; 其它角色的權(quán)限只是在這么做了之后才能獲得。如果沒有聲明,缺省是INHERIT。
這些子句決定一個角色是否可以登錄; 也就是說,該角色在客戶端連接的時候是否可以被給予初始化會話的認(rèn)證名字。 一個擁有LOGIN屬性的角色可以認(rèn)為是一個用戶。 沒有這個屬性的角色可以用于管理數(shù)據(jù)庫權(quán)限,但是并不是平常概念的用戶。 如果沒有聲明,除非是調(diào)用CREATE ROLE的別名CREATE USER,否則缺省將是NOLOGIN。
如果角色可以登錄,這個參數(shù)聲明該角色可以使用的并發(fā)連接數(shù)量。 -1(缺省)意味著沒有限制。
設(shè)置角色的口令??诹钪粚δ切碛?tt class="LITERAL">LOGIN屬性的角色有意義, 不過你當(dāng)然可以給沒有這個屬性的用戶定義口令。如果你不準(zhǔn)備使用口令認(rèn)證, 你可以忽略這個選項(xiàng)。如果沒有指定口令,口令將被設(shè)為空并且該用戶的密碼認(rèn)證將總是失敗。 也可以明確的用PASSWORD NULL指定口令為空
這些關(guān)鍵字控制存儲在系統(tǒng)表里面的口令是否加密。 如果沒有指定,那么缺省的行為由配置參數(shù)password_encryption控制。 因?yàn)橄到y(tǒng)無法對指定的口令字符串進(jìn)行解密, 所以如果目前的口令字符串已經(jīng)是用MD5加密的格式,那么那就會繼續(xù)照此存放, 而不管是否聲明了ENCRYPTED或UNENCRYPTED。 這樣就允許在轉(zhuǎn)儲/回復(fù)的時候重新加載加密的口令。
請注意老的客戶端可能缺乏對MD5認(rèn)證機(jī)制的支持,以密文形式存儲的口令 需要這個機(jī)制來運(yùn)作。
VALID UNTIL子句設(shè)置角色的口令失效的時間戳。 如果忽略了這個子句,那么口令將永遠(yuǎn)有效。
IN ROLE子句列出一個或多個現(xiàn)有的角色,新角色將 立即加入這些角色, 成為它們的成員。請注意沒有任何選項(xiàng)可以把新角色添加為管理員; 必須使用獨(dú)立的GRANT命令來做這件事情。
IN GROUP是IN ROLE過時的拼法。
ROLE子句列出一個或多個現(xiàn)有的角色, 它們將自動添加為這個新角色的成員。這個動作實(shí)際上就是把新角色做成 一個"組"。
ADMIN子句類似ROLE, 只是給出的角色被增加到新角色WITH ADMIN OPTION,給他們以把這個角色的成員權(quán)限賦與其它角色的權(quán)力。
USER子句是ROLE子句的過時拼法。
SYSID子句將被忽略,但是仍然接受之,主要為了 向下兼容。
使用ALTER ROLE改變一個角色的屬性, 使用DROP ROLE刪除一個角色。 所有在CREATE ROLE里聲明的角色都可以在隨后的ALTER ROLE命令里修改。
給一個當(dāng)作組來使用的角色添加或刪除成員的比較好的方法是使用GRANT和 REVOKE
VALID UNTIL子句只是為口令定義一個失效時限,而不是角色自身 的失效時限。特別要注意的是,當(dāng)以非口令為基礎(chǔ)的認(rèn)證方式登錄的時候,這個 失效時間將失去意義。
INHERIT屬性管理那些可賦予的權(quán)限的繼承關(guān)系,也就是數(shù)據(jù)庫對象的訪問權(quán)限和角色成員的關(guān)系。 它并不適用于CREATE ROLE和ALTER ROLE設(shè)置的特殊角色屬性。比如, 做為一個帶有CREATEDB權(quán)限的角色成員,并不直接擁有創(chuàng)建數(shù)據(jù)庫的能力, 即使設(shè)置了INHERIT也如此;該角色還是需要通過SET ROLE成為該角色,然后才能創(chuàng)建數(shù)據(jù)庫。
INHERIT屬性是缺省的,原因是為了向下兼容:在以前的PostgreSQL版本里, 用戶總是擁有他們所在組的所有權(quán)限。不過,NOINHERIT提供了與SQL標(biāo)準(zhǔn)所定義的最接近的語意。
要注意CREATEROLE權(quán)限,因?yàn)閷τ?tt class="LITERAL">CREATEROLE權(quán)限不存在繼承的概念。 擁有這個權(quán)限的角色可以很容易的創(chuàng)建一個與自身權(quán)限不同的非超級用戶角色。 例如,如果"user"角色擁有CREATEROLE權(quán)限而無CREATEDB權(quán)限, 那么他可以創(chuàng)建帶有CREATEDB權(quán)限的新角色。因此具有CREATEROLE權(quán)限的角色幾乎相當(dāng)于一個超級用戶。
PostgreSQL包括一個和CREATE ROLE有一樣功能的createuser程序(實(shí)際上就是調(diào)用這個命令), 可以從命令行shell上運(yùn)行
CONNECTION LIMIT選項(xiàng)只是近似地強(qiáng)制;如果兩個新的會話幾乎同時啟動, 而只有該角色只剩下一個"連接槽",那么很可能兩個連接都會失敗。同樣, 這個限制從來不會對超級用戶強(qiáng)制。
在這個指令中指定未加密的口令時必須小心??诹顚⒈灰悦魑姆绞絺鬟f給服務(wù)器, 同時還可能在客戶端的命令歷史或服務(wù)端日志中被記錄。 而createuser會將命令加密后傳遞給服務(wù)器。 同樣,psql包含一個\password可以用來安全的修改口令。
創(chuàng)建一個可以登錄的角色,但是不給他設(shè)置口令:
CREATE ROLE jonathan LOGIN;
創(chuàng)建一個帶口令的角色:
CREATE USER davide WITH PASSWORD 'jw8s0F4';
(CREATE USER和CREATE ROLE一樣,只不過它隱含LOGIN)
創(chuàng)建一個帶口令的角色,口令有效期到2004年底。在2005年跑了一秒之后,口令就不再有效。
CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';
創(chuàng)建一個可以創(chuàng)建數(shù)據(jù)庫和管理角色的角色:
CREATE ROLE admin WITH CREATEDB CREATEROLE;
CREATE ROLE語句在SQL標(biāo)準(zhǔn)里存在,但是標(biāo)準(zhǔn)只要求下面的語法
CREATE ROLE name [ WITH ADMIN role_name ]
多初始化管理員,以及所有其它CREATE ROLE的選項(xiàng), 都是PostgreSQL擴(kuò)展。
SQL標(biāo)準(zhǔn)定義了用戶和角色的概念,但是它認(rèn)為這兩個概念是完全獨(dú)立的概念, 并且要求定義用戶的所有命令都針對每個數(shù)據(jù)庫實(shí)現(xiàn)。 在PostgreSQL里選擇了把用戶和角色統(tǒng)一成一類對象。 因此角色比標(biāo)準(zhǔn)里的有更多的屬性。
SQL標(biāo)準(zhǔn)里聲明的行為非常接近于給予用戶NOINHERIT屬性, 而給予角色INHERIT屬性。