権限の管理を簡単にするために、ユーザをグループにまとめることはしばしば便利です。 グループ全体に対して権限を与えることも、取り消すこともできます。 PostgreSQLでは、グループを表すロールを作成することで行われます。 そして、そのグループロールに個々のユーザロールのメンバ資格を与えます。
グループロールを設定するには、まずロールを作成します。
CREATE ROLE name;
通常、グループとして使用されるロールにはLOGIN属性を持たせません。
しかし、そうしたければ持たせることもできます。
グループロールをいったん作成すれば、GRANTおよびREVOKEコマンドを使用してメンバの追加と削除を行うことができます。
GRANTgroup_roleTOrole1, ... ; REVOKEgroup_roleFROMrole1, ... ;
他のグループロールへのメンバ資格を与えることもできます。
(グループロールと非グループロールとの間には実際には区別がないからです。)
データベースはグループのメンバ資格がループし、循環するような設定はさせません。
また、ロール内のメンバ資格を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;
グループロール内のメンバ資格も自動的に取り上げられます。 (しかし、メンバロールには何も影響ありません。)