無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

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 ロールで接続するとすぐに、 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 ROLE 

name

;

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


powered by SEO.CUG.NET