| PostgreSQL 14.5文書 | |||
|---|---|---|---|
| 第22章 データベースロール | |||
| 前へ | 上へ | 22.3. ロールのメンバ資格 | 次へ |
権限の管理を簡単にするために、ユーザをグループにまとめることはしばしば便利です。グループ全体に対して権限を与えることも、取り消すこともできます。PostgreSQLでは、グループを表すロールを作成することで行われます。そして、そのグループロールに個々のユーザロールのメンバ資格を与えます。
グループロールを設定するには、まずロールを作成します。
CREATE ROLEname;通常、グループとして使用されるロールには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 ROLEname;グループロール内のメンバ資格も自動的に取り上げられます。(しかし、メンバロールには何も影響ありません。)