権限の管理を簡単にするために、ユーザをグループにまとめることはしばしば便利です。 グループ全体に対して権限を与えることも、取り消すこともできます。 PostgreSQLでは、グループを表すロールを作成することで行われます。 そして、そのグループロールに個々のユーザロールのメンバ資格を与えます。
グループロールを設定するには、まずロールを作成します。
CREATE ROLE name
;
通常、グループとして使用されるロールにはLOGIN
属性を持たせません。
しかし、そうしたければ持たせることもできます。
グループロールをいったん作成すれば、GRANTおよびREVOKEコマンドを使用してメンバの追加と削除を行うことができます。
GRANTgroup_role
TOrole1
, ... ; REVOKEgroup_role
FROMrole1
, ... ;
他のグループロールへのメンバ資格を与えることもできます。
(グループロールと非グループロールとの間には実際には区別がないからです。)
データベースはグループのメンバ資格がループし、循環するような設定はさせません。
また、ロール内のメンバ資格をPUBLIC
に付与することはできません。
グループロールのメンバは、2つの方法でロールの権限を使用することができます。
1つ目は、グループ内のすべてのメンバは明示的に、一時的にそのグループロールに「なる」ためにSET ROLEを行うことができます。
この状態では、データベースセッションは元々のログインロールの権限ではなくグループの権限でアクセスされます。
そして、作成されたデータベースオブジェクトの所有者はログインロールではなくグループロールであるとみなされます。
2つ目は、INHERIT
属性を持つメンバロールは、それらがメンバとなるロールの権限を自動的に使用します。これには、ロールによって継承されるいかなる権限も含んでいます。
例えば、以下の状態を想定します。
CREATE ROLE joe LOGIN INHERIT; CREATE ROLE admin NOINHERIT; CREATE ROLE wheel NOINHERIT; GRANT admin TO joe; GRANT wheel TO admin;
joe
ロールで接続するとすぐに、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;
SET ROLE
コマンドによりいつでも、元のログインロールが直接あるいは間接的にメンバ資格を持つすべてのロールを選ぶことができます。
従って、上の例において、wheel
になる前にadmin
になることは必要ありません。
標準SQLでは、ユーザとロールとの間に明確な違いがあり、ユーザはロールのように自動的に権限を継承することができません。
PostgreSQLでこの振舞いを実現させるには、SQLロールとして使用するロールにはINHERIT
属性を付与し、SQLユーザとして使用するロールにはNOINHERIT
属性を付与します。
しかし、8.1リリースより前との互換性を保持するために、PostgreSQLはデフォルトで、すべてのロールにINHERIT
属性を付与します。
以前は、ユーザは常にメンバとして属するグループに付与された権限を常に使用できました。
LOGIN
、SUPERUSER
、CREATEDB
、およびCREATEROLE
ロール属性は、特別な権限とみなすことができますが、データベースオブジェクトに対する通常の権限のように継承されません。
こうした属性の1つを使用できるようにするためには、その属性を特定のロールに設定するように実際にSET ROLE
を行う必要があります。
上の例を続けると、admin
ロールにCREATEDB
権限とCREATEROLE
権限を付与することを選ぶことができます。
こうすると、joe
ロールとして接続するセッションでは、すぐさまこれらの権限を持ちません。
SET ROLE admin
を行った後で、この権限を持ちます。
グループロールを削除するには、DROP ROLEを使用してください。
DROP ROLE name
;
グループロール内のメンバ資格も自動的に取り上げられます。 (しかし、メンバロールには何も影響ありません。)