22.3. ロールのメンバ資格 #

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

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

CREATE ROLE name;

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

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

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

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

《マッチ度[]》1つ目は、グループ内のすべてのメンバは明示的に、一時的にそのグループロールになるためにSET ROLEを行うことができます。 この状態では、データベースセッションは元々のログインロールの権限ではなくグループの権限でアクセスされます。 そして、作成されたデータベースオブジェクトの所有者はログインロールではなくグループロールであるとみなされます。 2つ目は、INHERIT属性を持つメンバロールは、それらがメンバとなるロールの権限を自動的に使用します。これには、ロールによって継承されるいかなる権限も含んでいます。 例えば、以下の状態を想定します。 《機械翻訳》グループロールのメンバーは、2つの方法でロールの権限を使用できます。 まず、メンバーシップがSETオプションで付与されたメンバーロールは、SETオプションを使用して、一時的にグループロールになることができます。 この状態では、データベースセッションは、元のログインロールではなくグループロールの権限にアクセスでき、作成されたデータベースオブジェクトは、ログインロールではなくグループロールによって所有されているとみなされます。 次に、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ロールで接続するとすぐに、joeadmin権限を継承しますので、そのデータベースセッションではjoeに直接与えられた権限に加えて、adminに与えられた権限を使用することができます。 しかし、wheelに与えられた権限は利用できません。 joeは間接的にwheelのメンバですが、admin経由のメンバ資格はNOINHERIT属性を持っているためです。 《機械翻訳》ロールjoeとして接続した直後、データベースはjoeに直接付与された権限に加えて、adminislandに付与された権限を継承するため、これらの権限を使用できます。 ただし、wheelに付与された権限は使用できません。これは、joeが間接的にwheelのメンバーであるにもかかわらず、メンバーシップはadminを介して付与され、WITH INHERIT FALSEを使用して付与されたためです。後:

SET ROLE admin;

《機械翻訳》セッションは、adminに付与された権限のみを使用し、joeislandに付与された権限は使用しません。 後:

SET ROLE wheel;

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

SET ROLE joe;
SET ROLE NONE;
RESET ROLE;

注記

《機械翻訳》SET ROLEコマンドは、元のログインロールが直接的または間接的にメンバーであるロールを常に選択できるようにします。 メンバーシップの許可の連鎖が存在し、それぞれがSET TRUE(デフォルト)である場合です。 したがって、上記の例では、adminになる前にwheelになる必要はありません。 一方、islandになることはできません。 joeは継承を介してのみこれらの権限にアクセスできます。

注記

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

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

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

DROP ROLE name;

グループロール内のメンバ資格も自動的に取り上げられます。 (しかし、メンバロールには何も影響ありません。)