CREATE ROLE name [ [ WITH ] option [ ... ] ]
ここでoptionは以下の通りです。
SUPERUSER | NOSUPERUSER
| CREATEDB | NOCREATEDB
| CREATEROLE | NOCREATEROLE
| CREATEUSER | NOCREATEUSER
| INHERIT | NOINHERIT
| LOGIN | NOLOGIN
| REPLICATION | NOREPLICATION
| CONNECTION LIMIT connlimit
| [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
| 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データベースクラスタに新しいロールを加えます。 ロールとは、自身でデータベースオブジェクトを所有することができ、データベース権限を持つことができる実体のことです。 ロールは、使用状況に応じて"ユーザ"、"グループ"、もしくは、その両方であるとみなすことができます。 ユーザの管理と認証に関する情報については、第20章と第19章を参照してください。 このコマンドを使用するには、CREATEROLE権限を持つか、データベースのスーパーユーザでなければなりません。
ロールはデータベースクラスタのレベルで定義されるため、クラスタ内のすべてのデータベースで有効となることに注意してください。
新しいロールの名前です。
これらの句によって、新しいロールが"スーパーユーザ"となるかどうかが決まります。 "スーパーユーザ"はデータベース内のアクセス制限をすべて変更することができます。 スーパーユーザという状態は危険ですので、本当に必要な場合にのみ使用しなければなりません。 新しくスーパーユーザを作成するには、スーパーユーザでなければなりません。 指定されなかった場合のデフォルトはNOSUPERUSERです。
これらの句はロールのデータベースの作成に関する権限を定義します。 CREATEDBが指定された場合、新しくデータベースを作成することができるように、ロールが作成されます。 NOCREATEDBを使用した場合、そのロールにはデータベースを作成する権限が与えられません。 指定されなかった場合のデフォルトはNOCREATEDBです。
これらの句は、ロールが新しいロールを作成(つまりCREATE ROLEを実行)できるかどうかを決定します。 CREATEROLE権限を持つロールはロールを変更することも削除することもできます。 指定されなかった場合のデフォルトはNOCREATEROLEです。
これらの句は廃止予定ですが、SUPERUSERとNOSUPERUSERの別名として、まだ受け付けられます。 単純にCREATEROLEと同じであると考えるかもしれませんが、実際には異なることに注意してください。
これらの句は、ロールがそのロールが属するロールの権限を"継承"するかどうかを決定します。 INHERIT属性を持つロールは自動的に、直接またはメンバとして間接的に割り当てられたすべてのデータベース権限を使用します。 INHERITがないと、他のロール内のメンバ資格により得られる能力はそのロールへのSET ROLEだけです。 他のロールの持つ権限は、SET ROLEを行った後にのみ利用可能です。 指定されなかった場合のデフォルトはINHERITです。
これらの句により、ロールがログイン可能かどうか、つまり、そのロールをクライアント接続時にセッションを認証するための名前として使用することができるかどうかが決まります。 LOGIN属性を持つロールはユーザとみなすことができます。 この属性を持たないロールは、データベース権限を管理する際に有用ですが、普通の意味ではユーザとはいえません。 指定されなかった場合のデフォルトはNOLOGINです。 ただし、CREATE ROLEが別名のCREATE USERで呼び出された場合は例外です。
これらの句は、ロールがストリーミングレプリケーションを初期化でき、システムをバックアップモードとの遷移が可能かどうかを決定します。 REPLICATION属性を持つロールは、非常に高度な権限を持つものです。 このため実際にレプリケーションで使用するロールでのみ使用しなければなりません。 指定されない場合のデフォルトはNOREPLICATIONです。
ロールがログイン可能である場合、これは、ロールが確立できる最大同時接続数を指定します。 -1(デフォルト)は無制限を意味します。
ロールのパスワードを設定します。 (パスワードはLOGIN属性を持つロールでのみ意味がありますが、この属性を持たないロールにも定義することができます。) パスワード認証を行う予定がなければ、このオプションを省略することができます。 パスワードの指定がなければ、パスワードがNULLに設定され、そのアカウントでのパスワード認証は常に失敗します。 オプションとして、NULLというパスワードを明示的にPASSWORD NULLと記述することができます。
これらのキーワードを使用すると、パスワードを暗号化してシステムカタログに格納するかどうかを制御できます (指定されていない場合のデフォルトの動作は、password_encryption設定パラメータによって決まります)。 指定された文字列が既にMD5暗号化書式である場合は、ENCRYPTED、UNENCRYPTEDのどちらが指定されているかに関係なく、そのまま保存されます (システムでは、暗号化されたパスワードを復号できないからです)。 これにより、ダンプ/リストア時に暗号化パスワードを再読み込みすることができます。
古めのクライアントでは、暗号化して保存されたパスワードを使用するために必要なMD5認証機構をサポートしていない場合があることに注意してください。
VALID UNTIL句は、ロールのパスワードが無効になるまでの日時を設定します。 この句が省略された場合、パスワードは永遠に有効になります。
IN ROLE句には、新しく作成するロールを新規にメンバとして追加する既存の1つ以上のロールを列挙します。 (新しく作成するロールを管理者として追加するオプションがないことに注意してください。このためには別途GRANTコマンドを使用してください。)
IN GROUPはIN ROLEの別名で、廃止予定です。
ROLEには、新しく作成するロールのメンバとして自動的に追加する既存の1つ以上のロールを列挙します。 (これは新しく作成したロールを"グループ"とします。)
ADMIN句はROLEと似ていますが、新しく作成されるロールに指定されたロールがWITH ADMIN OPTIONとして追加される点が異なります。 つまり、新しく作成されるロールのメンバ資格を他者に与えることができる権利を、指定されたロールに与えます。
USER句はROLE句の別名で廃止予定です。
SYSID句は無視されます。後方互換性を維持するために受け付けられます。
ロールの属性を変更するにはALTER ROLEを、ユーザを削除するにはDROP ROLEを使用してください。 CREATE ROLEで指定したすべての属性は、後でALTER ROLEコマンドで変更可能です。
グループとして使用しているロールのメンバの追加、および、削除についての推奨方法は、GRANTとREVOKEを使用することです。
VALID UNTIL句は、パスワードのみの有効期限を定義します。 ユーザアカウントの有効期限ではありません。 特に、パスワードを元にしない認証方式でログインを行う場合には、この有効期限は強制されません。
INHERIT属性は、許可可能な権限(つまり、データベースオブジェクトに対するアクセス権限とロールのメンバ資格)の継承を管理します。 これは、CREATE ROLEやALTER ROLEで設定される特別なロール属性には適用されません。 INHERITが設定されていたとしても、例えば、CREATEDB権限を持つロールのメンバであっても、データベース作成権限は即座に付与されません。 データベースを作成する前にSET ROLEを使用してそのロールにならなければなりません。
後方互換性を維持するため、INHERIT属性はデフォルトです。 以前のリリースのPostgreSQLでは、ユーザは常にメンバとなっているすべてのグループの権限でアクセスできました。 しかし、NOINHERITの方が標準SQLの規定の意味により合ったものを提供します。
CREATEROLE権限には注意が必要です。 CREATEROLE ロールという権限には継承という概念がありません。 あるロールが特定の権限を持っていなくても、別のロールを作成できることを意味します。つまり、簡単に自身の持つ権限と異なる権限(スーパーユーザ権限を持つロールは除きます)を持つ別のロールを作成できてしまいます。 たとえば、CREATEROLE権限を持ち、CREATEDB権限を持たない"user"というロールが、CREATEDB権限を持つロールを新規に作成することができます。 したがって、CREATEROLE権限を持つロールは、ほとんどスーパーユーザ権限を持つロールと同じであるものと考えてください。
PostgreSQLには、CREATE ROLEと同じ機能を持つ(実際にこのコマンドを呼び出しています)createuserプログラムがあり、コマンドシェルから実行することができます。
CONNECTION LIMITオプションが加える制限は厳密ではありません。 もしそのロールに1つだけ接続"スロット"が残っていた時に、ほぼ同時に2つのセッションが新しく始まった場合、両方とも失敗する可能性があります。 また、この制限はスーパーユーザには適用されません。
このコマンドで暗号化しないパスワードを指定するときには注意しなければなりません。 パスワードはサーバに平文で送信されます。 クライアントのコマンド履歴やサーバのログにこれが残ってしまうかもしれません。 しかし、createuserコマンドはパスワードを暗号化して送信します。 また、psqlには\passwordコマンドがあります。これを使用して後でパスワードを安全に変更することができます。
ログイン可能なロールを作成します。ただし、パスワードはありません。
CREATE ROLE jonathan LOGIN;
パスワード付きのロールを作成します。
CREATE USER davide WITH PASSWORD 'jw8s0F4';
CREATE USERはLOGINを意味する点を除き、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属性を与えること、ロールはINHERIT 属性を与えることで、標準SQLで規定された振舞いをほぼ完全に行うことができます。