19.4. ロールのメンバ資格

権限の管理を簡単にするために、ユーザをグループにまとめることはしばしば便利です。 グループ全体に対して権限を与えることも、取り上げることもできます。 PostgreSQLでは、グループを表すロールを作成することで行われます。 そして、そのグループロールに個々のユーザロールのメンバ資格を与えます。

グループロールを設定するには、まずロールを作成します。

CREATE ROLE name;

通常、グループとして使用されるロールにはLOGINを持たせません。 しかし、そうしたければ持たせることもできます。

グループロールをいったん作成すれば、GRANTおよびREVOKEコマンドを使用してメンバの追加と削除を行うことができます。

GRANT group_role TO role1, ... ;
REVOKE group_role FROM role1, ... ;

他のグループロールへのメンバ資格を与えることもできます。 (グループロールと非グループロールとの間には実際には区別がないからです。) データベースはグループのメンバ資格をループさせません。 また、ロール内のメンバ資格をPUBLICに付与することはできません。

ロールのメンバは、2つの方法でグループロールの権限を使用することができます。 まず、グループ内のすべてのメンバは明示的に、一時的にそのグループロールに"なる"ために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ロールで接続するとすぐに、joeadmin権限を"継承"しますので、そのデータベースセッションではjoeに直接与えられた権限に加えて、adminに与えられた権限を使用することができます。 しかし、wheelに与えられた権限は利用できません。 joeは間接的にwheelのメンバですが、admin経由のメンバ資格はNOINHERIT属性を持っているためです。

SET ROLE admin;

を行った後、セッションはadminに与えられた権限のみを使用できるようになります。 joeに与えられた権限は使用できなくなります。

SET ROLE wheel;

を行った後、セッションはwheelに与えられた権限のみを使用できるようになり、joeadminに与えられた権限は使用できなくなります。 元の状態の権限に戻すには、以下のいずれかを行います。

SET ROLE joe;
SET ROLE NONE;
RESET ROLE;

注意: SET ROLEコマンドはいつでも、元のログインロールが直接あるいは間接的にメンバ資格を持つすべてのロールを選ぶことができます。 従って、上の例において、wheelになる前にadminになることは必要ありません。

注意: 標準SQLでは、ユーザとロールとの間に明確な違いがあり、ユーザはロールのように自動的に権限を継承することができません。 PostgreSQLでこの振舞いを実現させたいのであれば、SQLロールとして使用するロールにはINHERIT属性を付与し、SQLユーザとして使用するロールにはNOINHERIT属性を付与します。 しかし、8.1リリースより前との互換性を保持するために、PostgreSQLはデフォルトで、すべてのロールにINHERIT属性を付与します。 以前は、ユーザは常にメンバとして属するグループに付与された権限を常に使用できました。

LOGINSUPERUSERCREATEDBCREATEROLEロール属性は、特別な権限とみなすことができますが、データベースオブジェクトに対する通常の権限のように継承されません。 こうした属性の1つを使用できるようにするためには、その属性を特定のロールに設定するように実際にSET ROLEを行う必要があります。 上の例を続けると、adminロールにCREATEDB権限とCREATEROLE権限を付与することを選ぶことができます。 こうすると、joeロールとして接続するセッションではこれらの権限はありません。 SET ROLE adminを行った後で、この権限を持ちます。

グループロールを削除するには、DROP ROLEを使用してください。

DROP ROLE name;

グループロール内のメンバ資格も自動的に取り上げられます。 (しかし、メンバロールには何も影響ありません。) しかし、先にグループロールが所有するオブジェクトをすべて削除しておくか所有者を変更しておく必要があり、また、グループに付与された権限もすべて取り上げられることに注意してください。