PostgreSQL 8.4.1文書
前のページ | 巻戻し |  | 早送り | 次のページ

# CREATE ROLE

## 名前

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

## 概要

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

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

          SUPERUSER | NOSUPERUSER
        | CREATEDB | NOCREATEDB
        | CREATEROLE | NOCREATEROLE
        | CREATEUSER | NOCREATEUSER
        | INHERIT | NOINHERIT
        | LOGIN | NOLOGIN
        | CONNECTION LIMIT connlimit
        | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
        | VALID UNTIL 'timestamp'
        | IN ROLE rolename [, ...]
        | IN GROUP rolename [, ...]
        | ROLE rolename [, ...]
        | ADMIN rolename [, ...]
        | USER rolename [, ...]
        | SYSID uid

## 説明

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

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

## パラメータ

`name`

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

`SUPERUSER`
`NOSUPERUSER`

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

`CREATEDB`
`NOCREATEDB`

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

`CREATEROLE`
`NOCREATEROLE`

  これらの句は、ロールが新しいロールを作成（つまり`CREATE ROLE`を実行）できるかどうかを決定します。 `CREATEROLE`権限を持つロールはロールを変更することも削除することもできます。 指定されなかった場合のデフォルトは`NOCREATEROLE`です。

`CREATEUSER`
`NOCREATEUSER`

  これらの句は廃止予定ですが、`SUPERUSER`と`NOSUPERUSER`の別名として、まだ受け付けられます。 単純に`CREATEROLE`と同じであると考えるかもしれませんが、実際には異なることに注意してください。

`INHERIT`
`NOINHERIT`

  これらの句は、ロールがそのロールが属するロールの権限を"継承"するかどうかを決定します。 `INHERIT`属性を持つロールは自動的に、直接またはメンバとして間接的に割り当てられたすべてのデータベース権限を使用します。 `INHERIT`がないと、他のロール内のメンバ資格により得られる能力はそのロールへの`SET ROLE`だけです。 他のロールの持つ権限は、`SET ROLE`を行った後にのみ利用可能です。 指定されなかった場合のデフォルトは`INHERIT`です。

`LOGIN`
`NOLOGIN`

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

`CONNECTION LIMIT` `connlimit`

  ロールがログイン可能である場合、これは、ロールが確立できる最大同時接続数を指定します。 -1（デフォルト）は無制限を意味します。

`PASSWORD` `password`

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

`ENCRYPTED`
`UNENCRYPTED`

  これらのキーワードを使用すると、パスワードを暗号化してシステムカタログに格納するかどうかを制御できます （指定されていない場合のデフォルトの動作は、password_encryption設定パラメータによって決まります）。 指定された文字列が既にMD5暗号化書式である場合は、`ENCRYPTED`、`UNENCRYPTED`のどちらが指定されているかに関係なく、そのまま保存されます （システムでは、暗号化されたパスワードを復号できないからです）。 これにより、ダンプ/リストア時に暗号化パスワードを再読み込みすることができます。

  古めのクライアントでは、暗号化して保存されたパスワードを使用するために必要なMD5認証機構をサポートしていない場合があることに注意してください。

`VALID UNTIL` '`timestamp`'

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

`IN ROLE` `rolename`

  `IN ROLE`句には、新しく作成するロールを新規にメンバとして追加する既存の1つ以上のロールを列挙します。 （新しく作成するロールを管理者として追加するオプションがないことに注意してください。このためには別途`GRANT`コマンドを使用してください。）

`IN GROUP` `rolename`

  `IN GROUP`は`IN ROLE`の別名で、廃止予定です。

`ROLE` `rolename`

  `ROLE`には、新しく作成するロールのメンバとして自動的に追加する既存の1つ以上のロールを列挙します。 （これは新しく作成したロールを"グループ"とします。）

`ADMIN` `rolename`

  `ADMIN`句は`ROLE`と似ていますが、新しく作成されるロールに指定されたロールが`WITH ADMIN OPTION`として追加される点が異なります。 つまり、新しく作成されるロールのメンバ資格を他者に与えることができる権利を、指定されたロールに与えます。

`USER` `rolename`

  `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 ROLE name [ WITH ADMIN rolename ]

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

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

ユーザは`NOINHERIT`属性を与えること、ロールは`INHERIT` 属性を与えることで、標準SQLで規定された振舞いをほぼ完全に行うことができます。

## 関連項目

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

前のページ | ホーム | 次のページ
CREATE OPERATOR FAMILY | 上に戻る | CREATE RULE