★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

CREATE ROLE

CREATE ROLE — 新しいデータベースロールを定義する

概要

CREATE ROLE name [ [ WITH ] option [ ... ] ]


ここでoptionは以下の通りです。

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
    | VALID UNTIL 'timestamp'
    | IN ROLE role_name [, ...]
    | IN GROUP role_name [, ...]
    | ROLE role_name [, ...]
    | ADMIN role_name [, ...]
    | USER role_name [, ...]
    | SYSID uid

説明

CREATE ROLEは、PostgreSQLデータベースクラスタに新しいロールを加えます。 ロールとは、データベースオブジェクトを所有することができ、データベース権限を持つことができる実体のことです。 ロールは、使用状況に応じてユーザグループ、もしくは、その両方であるとみなすことができます。 ユーザの管理と認証に関する情報については、第22章第21章を参照してください。 このコマンドを使用するには、CREATEROLE権限を持つか、データベースのスーパーユーザでなければなりません。

ロールはデータベースクラスタのレベルで定義されるため、クラスタ内のすべてのデータベースで有効となることに注意してください。

ロールの作成時に、新しく作成されたロールを既存のロールのメンバに直ちに割り当てることができます。また、既存のロールを新しく作成されたロールのメンバに割り当てることもできます。 初期ロールメンバ資格オプションが有効になるルールは、以下のIN ROLEROLEADMIN句で説明します。 GRANTコマンドは、メンバ資格の作成中に細かいオプション制御を行い、新しいロールが作成された後にこれらのオプションを変更する機能を持っています。

パラメータ

name

新しいロールの名前です。

SUPERUSER
NOSUPERUSER

これらの句によって、新しいロールがスーパーユーザとなるかどうかが決まります。 スーパーユーザはデータベース内のすべてのアクセス制限より優先します。 スーパーユーザという状態は危険ですので、本当に必要な場合にのみ使用しなければなりません。 新しくスーパーユーザを作成するには、スーパーユーザでなければなりません。 指定されなかった場合のデフォルトはNOSUPERUSERです。

CREATEDB
NOCREATEDB

これらの句はロールのデータベースの作成に関する権限を定義します。 CREATEDBが指定された場合、定義されたロールは新しくデータベースを作成することができます。 NOCREATEDBを使用した場合、そのロールにはデータベースを作成する権限が与えられません。 指定されなかった場合のデフォルトはNOCREATEDBです。 スーパーユーザロールもしくはCREATEDBを持つロールだけがCREATEDBを指定できます。

CREATEROLE
NOCREATEROLE

これらの句は、他のロールの作成、変更、削除、コメント付与、およびセキュリティラベルの変更をロールに許可するかどうかを決定します。 この権限によって付与される機能の詳細は、ロールの作成を参照してください。 指定されなかった場合のデフォルトはNOCREATEROLEです。

INHERIT
NOINHERIT

これは、このロールが別のロールのメンバとして追加された場合、このロールと将来のコマンドの両方でメンバ資格継承状態に影響します。 特に、このコマンドで追加されたメンバ資格の継承状態は、IN ROLE句を使用して制御され、後のコマンドではROLE句を使用して制御されます。 また、GRANTコマンドを使用してこのロールをメンバとして追加する際のデフォルトの継承状態としても使用されます。 指定しない場合、INHERITがデフォルトです。

16より前のPostgreSQLバージョンでは、継承はそのロールのすべてのランタイムメンバ資格チェックを制御するロールレベルの属性でした。

LOGIN
NOLOGIN

これらの句により、ロールがログイン可能かどうか、つまり、そのロールをクライアント接続時にセッションを認証するための名前として使用することができるかどうかが決まります。 LOGIN属性を持つロールはユーザとみなすことができます。 この属性を持たないロールは、データベース権限を管理する際に有用ですが、普通の意味ではユーザとはいえません。 指定されなかった場合のデフォルトはNOLOGINですが、CREATE ROLEがその別名であるCREATE USERで呼び出された場合は例外です。

REPLICATION
NOREPLICATION

これらの句は、ロールがレプリケーションロールかどうかを決定します。 レプリケーションモード(物理または論理レプリケーション)のサーバに接続できるためには、またレプリケーションスロットを作成または削除できるためには、ロールはこの属性(またはスーパーユーザ)を持っている必要があります。 REPLICATION属性を持つロールは、非常に高度な権限を持つものです。 このため実際にレプリケーションで使用するロールでのみ使用しなければなりません。 指定されない場合のデフォルトはNOREPLICATIONです。 スーパーユーザロールまたはREPLICATIONを持つロールだけがREPLICATIONを指定できます。

BYPASSRLS
NOBYPASSRLS

これらの構文は、ロールがすべての行単位セキュリティ(RLS)ポリシーを無視するかどうかを決定します。 NOBYPASSRLSがデフォルトです。 スーパーユーザロールまたはBYPASSRLSを持つロールだけがBYPASSRLSを指定できます。

pg_dumpはテーブルのすべての内容が確実にダンプされるようにするため、row_securityをデフォルトでOFFに設定することに注意してください。 pg_dumpを実行するユーザが適切な権限を持っていなければ、エラーが返されます。 しかしながら、スーパーユーザおよびダンプされるテーブルの所有者は、常にRLSを無視します。

CONNECTION LIMIT connlimit

ロールがログイン可能である場合、これは、ロールが確立できる最大同時接続数を指定します。 -1(デフォルト)は無制限を意味します。 通常の接続のみがこの制限の対象として数えられることに注意してください。 準備されたトランザクションやバックグラウンドワーカーの接続はこの制限の対象にはなりません。

[ ENCRYPTED ] PASSWORD 'password'
PASSWORD NULL

ロールのパスワードを設定します。 (パスワードはLOGIN属性を持つロールでのみ使用されますが、この属性を持たないロールにも定義することができます。) パスワード認証を行う予定がなければ、このオプションを省略することができます。 パスワードの指定がなければ、パスワードがNULLに設定され、そのアカウントでのパスワード認証は常に失敗します。 NULLというパスワードを明示的にPASSWORD NULLと記述することもできます。

注記

空の文字列を指定した場合もパスワードをNULLに設定しますが、PostgreSQLのバージョン10より前はそのようになっていませんでした。 以前のバージョンでは、認証方式と細かいバージョンによって空の文字列が使えたり使えなかったりし、また、いずれにせよlibpqは空の文字列を拒絶していました。 この曖昧さを避けるためには、空の文字列の指定は避けるのが良いです。

パスワードは必ず暗号化されてシステムカタログに保存されます。 ENCRYPTEDキーワードには何の効果もありませんが、後方互換性のために受け付けられます。 暗号化の方法は設定パラメータpassword_encryptionによって決定されます。 指定されたパスワード文字列が既にMD5またはSCRAMの暗号化形式になっている場合は、password_encryptionと関係なく、そのまま保存されます(指定のパスワードを暗号化した文字列を復号できないので、パスワードを別の形式で暗号化することができないからです)。 これにより、ダンプ/リストア時に暗号化したパスワードを再ロードすることができます。

VALID UNTIL 'timestamp'

VALID UNTIL句は、ロールのパスワードが無効になる日時を設定します。 この句が省略された場合、パスワードは永遠に有効になります。

IN ROLE role_name

IN ROLE句を指定すると、新しいロールが自動的に指定した既存のロールのメンバとして追加されます。 新しいメンバ資格はSETオプションが有効で、ADMINオプションは無効です。 NOINHERITオプションが指定されていない限り、INHERITオプションが有効になります。

IN GROUP role_name

IN GROUPIN ROLEの別名で、廃止予定です。

ROLE role_name

ROLE句を指定すると、指定された1つ以上の既存のロールがSETオプションを有効にしてメンバとして自動的に追加されます。 これは実質的に新しく作成したロールをグループとします。 この句で指定されたロールで、ロールレベルのINHERIT属性を持つものは、新しいメンバ資格でINHERITオプションが有効になります。 新しいメンバ資格では、ADMINオプションは無効になります。

ADMIN role_name

ADMIN句はROLEと同じ効果を持ちますが、指定されたロールはADMINが有効な新しいロールのメンバとして追加され、新しいロールで他のロールにメンバ資格を付与する権限が与えられます。

USER role_name

USER句はROLE句の別名で廃止予定です。

SYSID uid

SYSID句は無視されますが、後方互換性を維持するために受け付けられます。

注釈

ロールの属性を変更するにはALTER ROLEを、ロールを削除するにはDROP ROLEを使用してください。 CREATE ROLEで指定したすべての属性は、後でALTER ROLEコマンドで変更可能です。

グループとして使用しているロールのメンバの追加、および、削除についての推奨方法は、GRANTREVOKEを使用することです。

VALID UNTIL句は、パスワードの有効期限を定義するだけで、ロール自体の有効期限ではありません。 特に、パスワードを使わない認証方式でログインを行う場合には、この有効期限は強制されません。

ここで定義されるロール属性は継承不可です。すなわち、例えばCREATEDBを持つロールのメンバであることは、メンバ資格権限にINHERITオプションがあったとしても、新しいデータベースを作成することを許可しません。 もちろん、メンバ資格権限にSETオプションがある場合、メンバのロールはcreatedbロールにSET ROLEを行い、新しいデータベースを作成できます。

IN ROLEROLEADMIN句で作成されたメンバ資格の付与は、このコマンドを実行するロールを付与者として持ちます。

後方互換性を維持するため、INHERIT属性はデフォルトです。 以前のリリースのPostgreSQLでは、ユーザは常にメンバとなっているすべてのグループの権限でアクセスできました。 しかし、NOINHERITの方が標準SQLの規定の意味により合ったものを提供します。

PostgreSQLには、CREATE ROLEと同じ機能を持つプログラム(実際にこのコマンドを呼び出しています)createuserがあり、コマンドシェルから実行することができます。

CONNECTION LIMITオプションが加える制限は厳密ではありません。 もしそのロールに1つだけ接続スロットが残っていた時に、ほぼ同時に2つのセッションが新しく始まった場合、両方とも失敗する可能性があります。 また、この制限はスーパーユーザには適用されません。

このコマンドで暗号化しないパスワードを指定するときには注意しなければなりません。 パスワードはサーバに平文で送信されます。 クライアントのコマンド履歴やサーバのログにこれが残ってしまうかもしれません。 しかし、createuserコマンドはパスワードを暗号化して送信します。 また、psqlには\passwordコマンドがあり、これを使用して後でパスワードを安全に変更することができます。

ログイン可能なロールを作成します。ただし、パスワードはありません。

CREATE ROLE jonathan LOGIN;

パスワード付きのロールを作成します。

CREATE USER davide WITH PASSWORD 'jw8s0F4';

CREATE USERLOGINを意味する点を除き、CREATE ROLEと同一です。

2004年まで有効なパスワードを持つロールを作成します。 2005年に1秒でも入った時点でパスワードは無効になります。

CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';

データベースを作成でき、かつ、ロールを管理できるロールを作成します。

CREATE ROLE admin WITH CREATEDB CREATEROLE;

互換性

CREATE ROLE文は標準SQLで規定されています。 しかしSQLでは以下の構文のみを要求しています。

CREATE ROLE name [ WITH ADMIN role_name ]

複数の初期管理者やそのほかのCREATE ROLEのオプションはPostgreSQLの拡張です。

標準SQLでは、ユーザとロールという概念を定義し、それらを別の概念としてみなしています。 また、ユーザを定義するコマンドはすべて、各データベース実装で規定するものとしています。 PostgreSQLでは、ユーザとロールを単一の実体に統一することを選択しています。 したがって、ロールは標準よりも非常に多くのオプションの属性を持っています。

NOINHERITオプションを指定したPostgreSQLユーザとして標準SQLユーザを作成し、INHERITオプションを指定したPostgreSQLロールとして標準SQLロールを作成することで、標準SQLで規定された振舞いに最も近くなります。

関連項目

SET ROLE, ALTER ROLE, DROP ROLE, GRANT, REVOKE, createuser, createrole_self_grant