?
本文檔使用 php中文網手冊 發(fā)布
把用戶組合起來簡化權限管理是個常用的便利方法: 用這樣的方法,權限可以賦予整個組,也可以對整個組撤消。 在PostgreSQL里, 這些事情是通過創(chuàng)建代表一個組的角色, 然后賦予組角色的成員權限給獨立的用戶角色的方法實現(xiàn)的。
要設置一個組角色,首先創(chuàng)建角色:
CREATE ROLE name;
一般作為組使用的角色不應當具有LOGIN屬性,雖然你可以設置它。
一旦組角色已經存在了,那么你就可以用 GRANT和REVOKE命令添加和撤消權限:
GRANT group_role TO role1, ... ; REVOKE group_role FROM role1, ... ;
你還可以賦予成員權限給其它組角色(因為在組角色和非組角色之間沒有實質的區(qū)別)。 唯一的制約是你不能建立循環(huán)的成員關系。另外,不允許給 PUBLIC角色賦予成員權限。
一個組角色的成員可以用兩種方法使用組角色的權限。 首先,一個組的每個成員都可以明確用SET ROLE 臨時"變成"該組的成員。 在這個狀態(tài)下,數(shù)據庫會話具有該組角色的權限,而不是原始的登錄角色權限, 這個時候創(chuàng)建的數(shù)據庫對象被認為是由組角色擁有,而不是登錄角色。 第二,擁有INHERIT屬性的角色成員自動具有它們所屬組角色的權限。 例如,假如我們做了下面的事情:
CREATE ROLE joe LOGIN INHERIT; CREATE ROLE admin NOINHERIT; CREATE ROLE wheel NOINHERIT; GRANT admin TO joe; GRANT wheel TO admin;
那么在以角色joe連接之后,該數(shù)據庫會話將立即擁有直接賦予 joe的權限加上任何賦予admin的權限, 因為joe"繼承"了admin的權限。不過, 賦予 wheel 的權限不可用,因為即使joe是wheel 的一個間接成員, 但該成員關系是通過admin過來的,而該組有NOINHERIT 屬性。在
SET ROLE admin;
之后,該會話將只擁有那些已賦予admin的權限,而不包括那些已賦予joe的權限。在
SET ROLE wheel;
之后,該會話將只能使用已賦予wheel的權限,而不包括已賦予joe或admin的權限。 原來的權限可以用下列之一恢復:
SET ROLE joe; SET ROLE NONE; RESET ROLE;
Note: SET ROLE命令總是允許選取任意登錄角色直接或者間接所 在的組角色。因此,在上面的例子里,我們沒必要在 變成wheel之前先變成admin。
Note: 在SQL標準里,在用戶和角色之間有明確的區(qū)別, 并且用戶并不會自動繼承權限,而角色可以。 這個行為在PostgreSQL里面可以通過給予那些當作 SQL 角色使用的角色以INHERIT 屬性, 而給予當作SQL用戶使用的角色以 NOINHERIT屬性來實現(xiàn)。不過, PostgreSQL缺省是給予所有角色 INHERIT 屬性,目的是和8.1之前的版本向下兼容, 那些版本里,用戶總是能使用他們所在組被賦予的權限。
角色屬性LOGIN, SUPERUSER, CREATEDB可以被認為是特殊的權限, 但是它們從來不會像數(shù)據庫對象上的普通權限那樣繼承。 你必須明確地SET ROLE到一個特殊的角色, 這個角色應該是擁有這些屬性的角色, 然后才能利用這些屬性。繼續(xù)上面的例子, 我們也可以選擇給admin角色賦予CREATEDB和CREATEROLE 權限。然后,以joe連接的會話不會立即有這些權限, 只有在SET ROLE admin之后才有。
要刪除一個組角色,用DROP ROLE命令:
DROP ROLE name;
任何在組角色里面的成員關系都會自動撤消(但是成員角色自己則不受影響)。 不過,請注意任何組角色擁有的對象都必須首先刪除或者賦予其它所有者; 并且任何給該組角色賦予的權限都必須撤消。