PREPARATION
受験対策

オススメ!OSS-DB情報

第16回 権限管理

データベースでは複数人のユーザーが様々なデータを管理しています。自分が管理するデータを他人と共有したいこともあれば、他人に見られると困る場合もあります。このために、権限管理の仕組みがあります。
OSにも権限管理の仕組みがあり、例えばLinuxなどUnix系のOSでは、ファイルの所有者、グループ、その他のユーザについて、それぞれ読み取り、書き込み、実行の権限を付与するという形式ですが、データベースの権限管理はそれよりもかなり詳細なレベルで設定できます。
例えばテーブル(表)については、SELECT/UPDATE/INSERT/DELETEのそれぞれの操作についての権限を、各ユーザについて個別に設定できます。それだけでなく、テーブル内の各列について、SELECT/UPDATE/INSERTの権限を設定することも可能です。もちろん、ユーザ単位でなく、グループ(ロール)単位での設定も可能です。

権限管理の方法はSQLで標準化されていて、権限の付与はGRANT文、権限の剥奪にはREVOKE文を使います。一般的には
GRANT 権限名
[ON オブジェクト名]
TO ユーザ名
[WITH GRANT OPTION];
で権限を付与し、
REVOKE 権限名
[ON オブジェクト名]
FROM ユーザ名;
で権限を剥奪します。

GRANT文では多くの場合、WITH GRANT OPTIONを付加することにより、単に付与された権限を実行するだけでなく、それを更に他のユーザに与える権限を付与できます。

テーブルについてのSELECT, INSERT, UPDATE, DELETEの権限など多くの権限名はどのデータベースでも共通です。しかし、テーブル以外のオブジェクトについてのGRANT/REVOKEの構文、テーブルにトリガーを作成する権限の付与方法など、データベースによって仕様が異なるものもありますので、マニュアルを参照して再確認してください。
PostgreSQLのGRANT文のマニュアルは、以下のページにあります。
http://www.postgresql.jp/document/current/html/sql-grant.html

PostgreSQLにおける権限管理の方法について、簡単におさらいしましょう。

テーブルについての権限には、SELECT, INSERT, UPDATE, DELETEの他にTRUNCATE(TRUNCATE文を実行)、REFERENCES(外部キーによる参照)、TRIGGER(トリガの作成)があります。

シーケンスについての権限には、USAGE(currvalとnextvalの使用)、SELECT(currvalの使用)、UPDATE(nextvalとsetvalの使用)があります。

データベースについての権限には、CREATE(スキーマの作成)、CONNECT(接続)、TEMPORARY(一時テーブルの作成)があります。

スキーマについての権限には、CREATE(オブジェクトの作成)とUSAGE(オブジェクトの参照)があります。

いずれも複数の権限をカンマで区切って指定することで、複数の権限を同時に付与することができます。また、権限名をALL(あるいはALL PRIVILEGES)とすることで、そのオブジェクトに関するすべての権限を付与することもできます。

テーブルについての権限の場合、ON句は
ON table_name
のようにテーブル名だけを記述しても、
ON TABLE table_name
のように、テーブルが対象であることを明示しても良いですが、テーブル以外のオブジェクトの場合は、例えば
ON SEQUENCE seq_name
のように、対象となるオブジェクトの種類を明示する必要があります。

オブジェクト名はカンマで区切って複数指定することもできますが、テーブルの場合は ALL TABLES IN SCHEMA schema_name と指定することで、特定スキーマ内の全テーブル、という指定も可能です。

TO句に指定するユーザ名ですが、PUBLICを指定すると、全ユーザに対して権限を付与することができます。

PostgreSQLには、GRANT/REVOKEで管理できない特殊な権限がいくつかあります。
それは、データベースクラスタに関する権限で、具体的には、新規にユーザを作成する権限(CREATEROLE)、新規にデータベースを作成する権限(CREATEDB)、データベースクラスタに接続する権限(LOGIN)、スーパーユーザー権限(SUPERUSER)です。
これらは、createuserコマンド、あるいはCREATE USER文、CREATE ROLE文で新規にユーザを作成するときに指定するか、あるいは既存のユーザについてALTER USER文、ALTER ROLE文で付与・剥奪を行います。
例えば、
CREATE USER user1 CREATEROLE;
とすれば、ユーザ作成の権限を持つuser1というユーザを作ります。
ALTER USER user1 NOCREATEROLE CREATEDB;
とすれば、user1からユーザ作成の権限を剥奪し、データベース作成の権限を付与します。

解説:松田神一

LPI-Japan
Platinum Sponsors

関連資格