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を注意深く設定することが重要です。