第 17章データベースユーザと権限

目次
17.1. データベースユーザ
17.2. ユーザ属性
17.3. グループ
17.4. 権限
17.5. 関数とトリガ

すべてのデータベースクラスタに、データベースユーザの集合が含まれます。 これらのユーザは、サーバが稼働しているオペレーティングシステムによって管理されているユーザとは別のものです。 ユーザはデータベースオブジェクト(たとえばテーブル)を所有しており、これらのオブジェクトについての権限を他のユーザに割り当てて、誰がどのオブジェクトにアクセスできるかを制御できます。

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

17.1. データベースユーザ

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

CREATE USER name;

nameはSQL識別子の規則に従います。 特殊な文字を持たない無装飾のものか、二重引用符に囲まれたもののどちらかです。 既存のユーザを削除するためには類似のコマンド DROP USER を使います。

DROP USER name;

利便性を目的に、シェルのコマンドラインから呼び出し可能なプログラム createuserdropuser が、これらの SQL コマンドのラッパとして提供されています。

createuser name
dropuser name

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

データベースサーバへの接続において、正確に 1 つのユーザ ID が活動中となります。 特定のデータベース接続に使うユーザ名は、アプリケーション固有の方式で 接続要求を初期化するクライアントによって示されます。 たとえば、psqlプログラムはコマンドラインオプション -Uを使って接続するユーザを示します。 多くのアプリケーションでは、オペレーティングシステムの現在のユーザ名をデフォルトと仮定します (createuser および psql を含みます)。 したがって、2 つのユーザの集合で名前を一致させておくと便利です。

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