権限の管理を簡単にするために、ユーザをグループにまとめることはしばしば便利です。 グループ全体に対して権限を与えることも、取り消すこともできます。 PostgreSQLでは、グループを表すロールを作成することで行われます。 そして、そのグループロールに個々のユーザロールのメンバ資格を与えます。
グループロールを設定するには、まずロールを作成します。
CREATE ROLE name
;
通常、グループとして使用されるロールにはLOGIN
属性を持たせません。
しかし、そうしたければ持たせることもできます。
グループロールをいったん作成すれば、GRANT
およびREVOKE
コマンドを使用してメンバの追加と削除を行うことができます。
GRANTgroup_role
TOrole1
, ... ; REVOKEgroup_role
FROMrole1
, ... ;
他のグループロールへのメンバ資格を与えることもできます。
(グループロールと非グループロールとの間には実際には区別がないからです。)
データベースはグループのメンバ資格がループし、循環するような設定はさせません。
また、ロール内のメンバ資格を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
;
グループロール内のメンバ資格も自動的に取り上げられます。 (しかし、メンバロールには何も影響ありません。)