CREATE ROLE — 新しいデータベースロールを定義する
CREATE ROLEname[ [ WITH ]option[ ... ] ] ここでoptionは以下の通りです。 SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | INHERIT | NOINHERIT | LOGIN | NOLOGIN | REPLICATION | NOREPLICATION | BYPASSRLS | NOBYPASSRLS | CONNECTION LIMITconnlimit| [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL | VALID UNTIL 'timestamp' | IN ROLErole_name[, ...] | IN GROUProle_name[, ...] | ROLErole_name[, ...] | ADMINrole_name[, ...] | USERrole_name[, ...] | SYSIDuid
CREATE ROLEは、PostgreSQLデータベースクラスタに新しいロールを加えます。
ロールとは、データベースオブジェクトを所有することができ、データベース権限を持つことができる実体のことです。
ロールは、使用状況に応じて「ユーザ」、「グループ」、もしくは、その両方であるとみなすことができます。
ユーザの管理と認証に関する情報については、第21章と第20章を参照してください。
このコマンドを使用するには、CREATEROLE権限を持つか、データベースのスーパーユーザでなければなりません。
ロールはデータベースクラスタのレベルで定義されるため、クラスタ内のすべてのデータベースで有効となることに注意してください。
name新しいロールの名前です。
SUPERUSERNOSUPERUSER
これらの句によって、新しいロールが「スーパーユーザ」となるかどうかが決まります。
「スーパーユーザ」はデータベース内のすべてのアクセス制限より優先します。
スーパーユーザという状態は危険ですので、本当に必要な場合にのみ使用しなければなりません。
新しくスーパーユーザを作成するには、スーパーユーザでなければなりません。
指定されなかった場合のデフォルトはNOSUPERUSERです。
CREATEDBNOCREATEDB
これらの句はロールのデータベースの作成に関する権限を定義します。
CREATEDBが指定された場合、定義されたロールは新しくデータベースを作成することができます。
NOCREATEDBを使用した場合、そのロールにはデータベースを作成する権限が与えられません。
指定されなかった場合のデフォルトはNOCREATEDBです。
CREATEROLENOCREATEROLE
これらの句は、ロールが新しいロールを作成(つまりCREATE ROLEを実行)できるかどうかを決定します。
CREATEROLE権限を持つロールはロールを変更することも削除することもできます。
指定されなかった場合のデフォルトはNOCREATEROLEです。
INHERITNOINHERIT
これらの句は、ロールがそのロールが属するロールの権限を「継承」するかどうかを決定します。
INHERIT属性を持つロールは自動的に、直接的にまたは間接的にメンバとして割り当てられたすべてのデータベース権限を使用します。
INHERITがないと、他のロール内のメンバ資格により得られる能力はそのロールへのSET ROLEだけです。
他のロールの持つ権限は、SET ROLEを行った後にのみ利用可能です。
指定されなかった場合のデフォルトはINHERITです。
LOGINNOLOGIN
これらの句により、ロールがログイン可能かどうか、つまり、そのロールをクライアント接続時にセッションを認証するための名前として使用することができるかどうかが決まります。
LOGIN属性を持つロールはユーザとみなすことができます。
この属性を持たないロールは、データベース権限を管理する際に有用ですが、普通の意味ではユーザとはいえません。
指定されなかった場合のデフォルトはNOLOGINですが、CREATE ROLEがその別名であるCREATE USERで呼び出された場合は例外です。
REPLICATIONNOREPLICATION
これらの句は、ロールがレプリケーションロールかどうかを決定します。
レプリケーションモード(物理または論理レプリケーション)のサーバに接続できるためには、またレプリケーションスロットを作成または削除できるためには、ロールはこの属性(またはスーパーユーザ)を持っている必要があります。
REPLICATION属性を持つロールは、非常に高度な権限を持つものです。
このため実際にレプリケーションで使用するロールでのみ使用しなければなりません。
指定されない場合のデフォルトはNOREPLICATIONです。
BYPASSRLSNOBYPASSRLS
これらの構文は、ロールがすべての行単位セキュリティ(RLS)ポリシーを無視するかどうかを決定します。
NOBYPASSRLSがデフォルトです。
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句には、新しく作成するロールを新規にメンバとして追加する既存の1つ以上のロールを列挙します。
(新しく作成するロールを管理者として追加するオプションがないことに注意してください。このためには別途GRANTコマンドを使用してください。)
IN GROUP role_nameIN GROUPはIN ROLEの別名で、廃止予定です。
ROLE role_name
ROLEには、新しく作成するロールのメンバとして自動的に追加する既存の1つ以上のロールを列挙します。
(これは実質的に新しく作成したロールを「グループ」とします。)
ADMIN role_name
ADMIN句はROLEと似ていますが、新しく作成されるロールに指定されたロールがWITH ADMIN OPTIONとして追加される点が異なります。
つまり、新しく作成されるロールのメンバ資格を他者に与えることができる権利を、指定されたロールに与えます。
USER role_name
USER句はROLE句の別名で廃止予定です。
SYSID uid
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 ROLEname[ WITH ADMINrole_name]
複数の初期管理者やそのほかのCREATE ROLEのオプションはPostgreSQLの拡張です。
標準SQLでは、ユーザとロールという概念を定義し、それらを別の概念としてみなしています。 また、ユーザを定義するコマンドはすべて、各データベース実装で規定するものとしています。 PostgreSQLでは、ユーザとロールを単一の実体に統一することを選択しています。 したがって、ロールは標準よりも非常に多くのオプションの属性を持っています。
ユーザはNOINHERIT属性を与えること、ロールはINHERIT属性を与えることで、標準SQLで規定された振舞いに最も近くなります。