データベースロールは、権限を定義し、クライアント認証システムと相互作用する数多くの属性を持つことができます。
LOGIN属性を持つロールのみがデータベース接続の初期ロール名として使用できます。
LOGIN 属性を持つロールは「データベースユーザ」と同じであるとみなすことができます。
ログイン権限を持つロールの作成方法は、以下のいずれかです。
CREATE ROLEnameLOGIN; CREATE USERname;
(CREATE USERはデフォルトで LOGINを持ち、CREATE ROLEは持たないという点を除き、CREATE USERはCREATE ROLEと同じです。)
ログイン権限を除き、データベーススーパーユーザに対する権限検査は全て行われません。
これは危険な権限ですので、安易に使用してはいけません。
作業のほとんどを非スーパーユーザのロールで行うことが最善です。
新しいデータベーススーパーユーザを作成するには、CREATE ROLE を使用してください。
これはスーパーユーザのロールで実行しなければなりません。
name SUPERUSER
(全ての権限検査が行われないスーパーユーザを除き)ロールに明示的にデータベースを作成するための権限を指定しておかねばいけません。
そのようなロールを作るためにはCREATE ROLE を使用してください。
name CREATEDB
あるロールがロールを作成するには、明示的な権限が付与されていなければなりません。
(スーパーユーザは、すべての権限検査を迂回しますので、例外です。)
こうしたロールを作成するには、CREATE ROLE を使用してください。
name CREATEROLECREATEROLE権限を持つロールは、ADMINオプションを持つCREATEROLEユーザのロールを変更したり削除したりすることもできます。
そのような権限付与は、スーパーユーザではないCREATEROLEユーザが新しいロールを作った時に自動的に行われ、CREATEROLEユーザが、作成したロールを変更したり削除できるようになります。
ロールの変更には、たとえばパスワードの変更などを含む、ALTER ROLEを使って実行できるほとんどの変更が含まれます。
また、COMMENTとSECURITY LABELコマンドを使って実行できるロールの変更も含まれます。
しかし、CREATEROLEでは、SUPERUSERロールを作成する能力は移譲されませんし、既存のSUPERUSERロールに対する権限も移譲されません。
さらに、CREATEROLEでは、REPLICATIONユーザを作成する機能も、REPLICATION権限を付与または取り消す能力も、そのようなユーザのロール属性を変更する能力も移譲されません。
ただし、REPLICATIONロールでのALTER ROLE ... SETおよびALTER ROLE ... RENAMEの使用、およびCOMMENT ON ROLE、SECURITY LABEL ON ROLE、DROP ROLEの使用は許可されます。
最後に、CREATEROLEでは、BYPASSRLS権限を付与または取り消す能力は付与されません。
あるロールがストリーミングレプリケーションの新規接続を実施するには、明示的な権限が付与されていなければなりません。
(スーパーユーザは、すべての権限検査を迂回しますので、例外です。)
ストリーミングレプリケーションを行うロールは、LOGIN権限も持っていることが必要です。
こうしたロールを作成するには、CREATE ROLE を使用してください。
name REPLICATION LOGIN
パスワードは、クライアント認証方法においてデータベースに接続する際にユーザにパスワードを要求する場合にのみ重要になります。
passwordとmd5認証方式でパスワードが使用されます。
データベースパスワードはオペレーティングシステムのパスワードとは異なります。
ロール作成時にCREATE ROLE のようにパスワードを指定します。
name PASSWORD 'string'
ロールは、デフォルトでメンバであるロールの権限を継承します。
ただし、デフォルトで権限を継承しないロールを作成するには、CREATE ROLE を使用します。
別の方法として、name NOINHERITWITH INHERIT TRUE、あるいはWITH INHERIT FALSEを使用して個々の権限の継承を上書きすることもできます。
(全ての権限検査が行われないスーパーユーザを除き)ロールに明示的にすべての行単位セキュリティ(RLS)ポリシーをバイパスするための権限を指定しておかねばなりません。
そのようなロールを作るためには、スーパーユーザでCREATE ROLE を使用してください。
name BYPASSRLS
接続制限では、ロールが作成できる同時接続数を指定できます。
-1(デフォルト)は制限なしを意味します。
CREATE ROLE でロール作成時に接続制限を指定します。
name CONNECTION LIMIT 'integer'
ロール属性は、ロールを作成した後でもALTER ROLEコマンドで変更できます。
詳細はCREATE ROLEとALTER ROLEのマニュアルページを参照してください。
ロールは、第20章で説明されている実行時の設定の多くをロールごとのデフォルトに設定することもできます。 例えば何らかの理由で、自分が接続する時は常にインデックススキャンを無効にしたい場合(注:お勧めしません)、次のようにします。
ALTER ROLE myname SET enable_indexscan TO off;
このようにして設定を保存します(ただし、すぐに反映はされません)。
以降のこのロールによる接続においては、セッションの開始の直前にSET enable_indexscan TO off;が呼び出されたのと同様になります。
これはデフォルトとする設定をするだけなので、設定をセッション途中いつでも変更できます。
ロール固有のデフォルト設定を削除するには、ALTER ROLE を使用してください。
呼び出されることがありませんので、rolename RESET varnameLOGIN権限を持たないロールにロール固有のデフォルトを持たせることに意味がないことに注意してください。
非スーパーユーザがCREATEROLE権限を使用してロールを作成すると、作成されたロールは自動的に作成元のユーザに再度付与されます。これは、ブートストラップスーパーユーザがコマンドGRANT created_user TO creating_user WITH ADMIN OPTION, SET FALSE, INHERIT FALSEを実行した場合と同じです。
CREATEROLEユーザが、既存のロールに関して特別な権限を行使できるのは、そのロールに対するADMIN OPTION権限がある場合のみですので、この権限は、CREATEROLEユーザが作成したロールを管理するのに十分なだけです。
一方、INHERIT FALSE, SET FALSEで作成されたため、このCREATEROLEユーザは作成されたロールの権限をデフォルトで継承していませんし、SET ROLEを使ってそのロールの権限にアクセスできません。
しかし、ロールに対するADMIN OPTIONを持つユーザは、そのロールのメンバシップを他のユーザに付与できるため、CREATEROLEユーザは、そのロールを自分自身にINHERITまたはSETオプションで付与するだけで、作成したロールへのアクセス権を獲得できます。
したがって、権限がデフォルトで継承されないこと、またはデフォルトでSET ROLEが付与されないことは、事故に対する安全策であり、セキュリティ機能ではありません。
また、この自動的な付与はブートストラップユーザによって与えられるため、CREATEROLEユーザによって削除または変更することはできないことに注意してください。しかし、スーパーユーザはそれを取り消したり、修正したり、他のCREATEROLEユーザに対してそのようなグラントを追加したりすることができます。
どのCREATEROLEユーザも、ある時点でロールに対してADMIN OPTIONを持っているかどうかに関係なく、それを管理できます。