第 18章データベースロールと権限

目次
18.1. データベースロール
18.2. ロールの属性
18.3. 権限
18.4. ロールのメンバ資格
18.5. 関数とトリガ

PostgreSQLは、ロールという概念を使用してデータベース全体の権限を管理します。 ロールは、その設定方法に応じて、データベースユーザ、データベースユーザのまとまりとみなすことができます。 ロールはデータベースオブジェクト(例えばテーブル)を所有することができます。 またロールは、データベースオブジェクトに誰がアクセスできるのかを制御するために、オブジェクトの権限に他のロールを割り当てることもできます。 更に、ロールのメンバ資格を他のロールに与えることもできます。 メンバとなったロールは、メンバが属するロールに割り当てられた権限を使用することができます。

ロールの概念には、"ユーザ"という概念と"グループ"という概念が含まれます。 PostgreSQLバージョン8.1より前まででは、ユーザとグループは異なる種類の実体として扱われていました。 しかし、現在ではロールしか存在しません。 すべてのロールは、ユーザとして、グループとして、またはその両方として動作することができます。

本章では、ロールの作成と管理の方法について説明するとともに、権限システムについて紹介します。 データベースオブジェクトの様々な種類や権限の効果についての詳細な情報は第5章に記載されています。

18.1. データベースロール

データベースロールは概念的に、オペレーティングシステムユーザとは完全に分離されています。 実際にはユーザ名を一致させておくと便利ですが、必須ではありません。 データベースロール名はデータベースクラスタインストレーション全体で共通です (個別のデータベースごとではありません)。 ユーザを作成するためにはCREATE ROLE SQLコマンドを使います。

CREATE ROLE name;

nameはSQL識別子の規則に従います。 特殊な文字を持たない無装飾のものか、二重引用符に囲まれたもののどちらかです。 (現実的には、通常他のオプション、例えばLOGINなどをこのコマンドに付与することになるでしょう。 詳細は後で説明します。) 既存のユーザを削除するためには類似のコマンドDROP ROLEを使用してください。

DROP ROLE name;

利便性のために、これらのSQLコマンドのラッパである、シェルのコマンドラインから呼び出し可能なcreateuserプログラムとdropuserプログラムが提供されています。

createuser name
dropuser name

既存のロール群を求めるためには、以下のようにpg_rolesシステムカタログを確認してください。

SELECT rolname FROM pg_roles;

また、psqlプログラムの\duメタコマンドも既存のロールを列挙する際に役に立ちます。

データベースシステム自身を起動するために、初期化されたばかりのシステムは常に定義済みのロールを1人持ちます。 このロールは必ず"スーパーユーザ"であり、デフォルトでは(initdb実行時に変更しない限り)そのデータベースクラスタを初期化したオペレーティングシステムユーザと同じ名前となります。 習慣的にこのロールはpostgresと名付けられます。 ロールを追加する場合はまずこの初期ロールで接続しなければいけません。

すべてのデータベースサーバへの接続は、特定のロールの名前で確立し、そのロールによりその接続で発行されるコマンドの初期のアクセス権限が決まります。 特定のデータベース接続に使うロールは、アプリケーション固有の方式で接続要求を初期化するクライアントによって指示されます。 例えば、psqlプログラムでは、-Uコマンドラインオプションを使って接続するロールを指示します。 多くのアプリケーション(createuserおよびpsqlを含む)では、オペレーティングシステムの現在のユーザ名をデフォルトと仮定します。 したがって、ロールとオペレーティングシステムのユーザの組み合わせ間で名前を一致させておくと便利です。

与えられたクライアント接続で接続できるデータベースロールの集合は、第20章で説明されているように、クライアント認証の設定によって決められます (したがって、ユーザのログイン名が本名と一致していなくても構わないのと同様に、クライアントは必ずしもオペレーティングシステムのユーザ名と同じロール名で接続する必要はありません)。 接続したクライアントに付与される権限の内容はロールIDによって決定されるため、マルチユーザ環境を設定する際にはロールIDを注意深く設定することが重要です。