【PostgreSQL】間違いやすいCREATE USER / ROLEの違い

PostgreSQLで新しく接続するユーザーを作りたいとき、どのコマンドを実行すればよいでしょうか?
ログインユーザーの作成か、ロールの作成か、そもそもロールとは?、CREATE USERcreateuserの違いは?と、 改めて考えるとごちゃごちゃしてしまうもの。それらを一目してわかるようまとめました。

コマンド createdb権限 スーパーユーザ権限 ログイン権限 ロール作成権限 レプリケーション権限
CREATE USER False False True False False
CREATE ROLE False False False False False
createuser False False True False False
createrole ※このようなコマンドは存在しない!

※オプションを指定せずデフォルトで実行した場合

CREATE USERCREATE 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を参照してます。

シェルのコマンドなのかPostgreSQLのコマンドなのか、いつも曖昧になってしまう。。。

※この記事はOSS-DB Silver対策問題集(http://oss-db-taisaku.net/pt/check_sql.php)より記事を移設したものです。

スポンサーリンク
おすすめの記事