権限の管理を簡単にするために、ユーザをグループにまとめることはしばしば便利です。 グループ全体に対して権限を与えることも、取り消すこともできます。 PostgreSQLでは、グループを表すロールを作成することで行われます。 そして、そのグループロールに個々のユーザロールのメンバ資格を与えます。
グループロールを設定するには、まずロールを作成します。
CREATE ROLE name;
通常、グループとして使用されるロールにはLOGIN属性を持たせません。
しかし、そうしたければ持たせることもできます。
グループロールをいったん作成すれば、GRANTおよびREVOKEコマンドを使用してメンバの追加と削除を行うことができます。
GRANTgroup_roleTOrole1, ... ; REVOKEgroup_roleFROMrole1, ... ;
他のグループロールへのメンバ資格を与えることもできます。
(グループロールと非グループロールとの間には実際には区別がないからです。)
データベースはグループのメンバ資格がループし、循環するような設定はさせません。
また、ロール内のメンバ資格をPUBLICに付与することはできません。
グループロールのメンバは、2つの方法でロールの権限を使用できます。
1つ目として、メンバ資格がSETオプションで付与されたメンバロールは、SETオプションを使用して、一時的にグループロール「になる」ことができます。
この状態では、データベースセッションは、元のログインロールではなくグループロールの権限にアクセスでき、作成されたデータベースオブジェクトは、ログインロールではなくグループロールによって所有されているとみなされます。
2つ目として、INHERITオプションでメンバ資格が付与されたメンバロールは、直接的または間接的にメンバであるメンバの権限を自動的に使用できます。ただし、この連鎖は継承オプションを持たないメンバ資格で停止します。
例えば、以下の状態を想定します。
CREATE ROLE joe LOGIN; CREATE ROLE admin; CREATE ROLE wheel; CREATE ROLE island; GRANT admin TO joe WITH INHERIT TRUE; GRANT wheel TO admin WITH INHERIT FALSE; GRANT island TO joe WITH INHERIT TRUE, SET FALSE;
ロールjoeとして接続した直後、データベースはjoeに直接付与された権限に加えて、adminとislandに付与された権限を「継承」するため、これらの権限を使用できます。
ただし、wheelに付与された権限は使用できません。これは、joeが間接的にwheelのメンバであるにもかかわらず、メンバシップはadminを介して付与され、WITH INHERIT FALSEを使用して付与されたためです。
SET ROLE admin;
を行った後、セッションは、adminに付与された権限のみを使用し、joeやislandに付与された権限は使用しません。
SET ROLE wheel;
を行った後、セッションはwheelに与えられた権限のみを使用できるようになり、joeやadminに与えられた権限は使用できなくなります。
元の状態の権限に戻すには、以下のいずれかを行います。
SET ROLE joe; SET ROLE NONE; RESET ROLE;
メンバシップの許可の連鎖が存在し、それぞれがSET TRUE(デフォルトです)である場合、SET ROLEコマンドは、元のログインロールが直接的または間接的にメンバであるロールを常に選択できるようにします。
したがって、上記の例では、adminになる前にwheelになる必要はありません。
一方、islandになることはできません。 joeは継承を介してのみこれらの権限にアクセスできます。
標準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;
グループロール内のメンバ資格も自動的に取り上げられます。 (しかし、メンバロールには何も影響ありません。)