PostgreSQLで新しく接続するユーザーを作りたいとき、どのコマンドを実行すればよいでしょうか?
ログインユーザーの作成か、ロールの作成か、そもそもロールとは?、CREATE USERとcreateuserの違いは?と、 改めて考えるとごちゃごちゃしてしまうもの。それらを一目してわかるようまとめました。
コマンド | createdb権限 | スーパーユーザ権限 | ログイン権限 | ロール作成権限 | レプリケーション権限 |
CREATE USER | False | False | True | False | False |
CREATE ROLE | False | False | False | False | False |
createuser | False | False | True | False | False |
createrole | ※このようなコマンドは存在しない! |
※オプションを指定せずデフォルトで実行した場合
CREATE USERとCREATE ROLEの違いを一言でいえば、”ログイン権限をデフォルトで割り当てるかどうか”のみです。 それ以外のデフォルト権限はすべて同一であり、オプションで上書きする場合の構文もすべて同一となります。
createuserは、OSコマンドライン上で用意されているもので、SQLコマンドではないです。 createuserコマンドのオプションについて試験問題で問われた場合、オプションが省略形(ハイフンに英字一文字)であれば、 小文字は許可、大文字は不許可と覚えておけばひとまず良いと思います。
※実際コマンドのバージョンを確認する”--V”以外はすべて不許可・禁止するオプションです。
createroleというコマンドはないのですが、OSS-DB関連で引っ掛け問題を見た記憶があります。
本試験で問われるかどうかは微妙かもしれませんが、CREATE USER / ROLEと同様にあたかも存在するように出題されると引っ掛かりやすいので、 明確に存在しないことを覚えておいたほうがいいと思います。
デフォルトのパラメータ
オプションなしで実行した場合、下記のオプションが指定されたものと同様の権限でロールが作成されます。
コマンド名 | createdb権限 | スーパーユーザ権限 | ログイン権限 | ロール作成権限 | レプリケーション権限 |
CREATE USER | NOCREATEDB | NOSUPERUSER | LOGIN | NOCREATEROLE | NOREPLICATION |
CREATE ROLE | 〃 | 〃 | NOLOGIN | 〃 | 〃 |
createuser | -D(--no-createdb) |
-S(--no-superuser) |
LOGIN | -R(--no-createrole) | --no-replication |
作成したユーザ / ロールを確認してみる
※OSS-DB試験範囲外です!!
ロールは、使用状況に応じて「ユーザ」、「グループ」、もしくは、その両方であるとみなすことができます。と公式にはあります。
ユーザを確認するシステムカタログ(pg_user)や\duを実行してみると、下記のようにログイン権限がない場合、pg_userでは表示されません。そのためユーザ=ログイン権限があるとの認識でよいと思います。
pg_userの場合
postgres=# select * from pg_user;
usename | usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | useconfig
----------+----------+-------------+----------+---------+--------------+----------+----------+-----------
postgres | 10 | t | t | t | t | ******** | |
user1 | 75097 | f | f | f | f | ******** | |
\du(pg_roles)の場合
postgres=# \du
ロール一覧
ロール名 | 属性 | 所属グループ
----------+------------------------------------------------------------------------------+--------------
postgres | スーパーユーザー, ロール作成可, DB作成可, レプリケーション可, RLS のバイパス | {}
role1 | ログインできません | {}
user1 | | {}
※role1はCREATE ROLEで作成し、user1はCREATE USERで作成したユーザで、それぞれオプションなしで実行したものになります。
※\duは(システムカタログ)pg_rolesを参照してます。
※この記事はOSS-DB Silver対策問題集(http://oss-db-taisaku.net/pt/check_sql.php)より記事を移設したものです。