★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

20.3. ロールのメンバ資格

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

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

CREATE ROLE name;

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

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

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

他のグループロールへのメンバ資格を与えることもできます。 (グループロールと非グループロールとの間には実際には区別がないからです。) データベースはグループのメンバ資格がループし、循環するような設定はさせません。 また、ロール内のメンバ資格を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ロールで接続するとすぐに、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属性を付与します。 以前は、ユーザは常にメンバとして属するグループに付与された権限を常に使用できました。

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

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

DROP ROLE name;

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