このセクションでは、PostgreSQLのロール(ユーザー)の基本操作について紹介します。PostgreSQL は、ロールという概念を使用してデータベース全体のアクセス権限を管理しています。

postgres ユーザーでデータベースに接続します。

[root@db-1 ~]# sudo -u postgres psql -U postgres
could not change directory to "/root": Permission denied
psql (11.1)
Type "help" for help.

postgres=# 

ロール(ユーザー)の作成

ロールは作成します。ここでは、ロールのパスワードは pguser で pguser というロールを作成しています。

postgres=# create role pguser login encrypted password 'pguser';
CREATE ROLE
postgres=# 

ロール(ユーザー)のパスワード変更

ロールのパスワードは変更します。ここでは、pguser のロールのパスワードを pguser1 として変更しています。

postgres=# alter role pguser password 'pguser1';
ALTER ROLE
postgres=# 

ロール(ユーザー)の確認

現在存在するロールを確認します。

postgres=# select rolname from pg_roles;
          rolname          
---------------------------
 postgres
 pg_monitor
 pg_read_all_settings
 pg_read_all_stats
 pg_stat_scan_tables
 pg_read_server_files
 pg_write_server_files
 pg_execute_server_program
 pg_signal_backend
(9 rows)

postgres=#

以下コマンドを実行すると、ロールの詳細を確認できます。

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member
 of 
-----------+------------------------------------------------------------+-------
----
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres=# 

以下コマンドを実行すると、ロールの詳細とパスワード情報を確認できます。ただし、パスワードは暗号化されている場合には読み取ることができません。

postgres=# select * from pg_authid;
          rolname          | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls | rolconnlimit |             rolpassword             | rolvaliduntil 
---------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------------------------------+---------------
 postgres                  | t        | t          | t             | t           | t           | t              | t            |           -1 |                                     | 
 pg_monitor                | f        | t          | f             | f           | f           | f              | f            |           -1 |                                     | 
 pg_read_all_settings      | f        | t          | f             | f           | f           | f              | f            |           -1 |                                     | 
 pg_read_all_stats         | f        | t          | f             | f           | f           | f              | f            |           -1 |                                     | 
 pg_stat_scan_tables       | f        | t          | f             | f           | f           | f              | f            |           -1 |                                     | 
 pg_read_server_files      | f        | t          | f             | f           | f           | f              | f            |           -1 |                                     | 
 pg_write_server_files     | f        | t          | f             | f           | f           | f              | f            |           -1 |                                     | 
 pg_execute_server_program | f        | t          | f             | f           | f           | f              | f            |           -1 |                                     | 
 pg_signal_backend         | f        | t          | f             | f           | f           | f              | f            |           -1 |                                     | 
 pguser                    | f        | t          | f             | f           | t           | f              | f            |           -1 | md5e37525e5632540767d3611d0f153913b | 
 pguser2                   | f        | t          | f             | f           | t           | f              | f            |           -1 | md59083e2443589bb7ddb4dd57a945919be | 
 pguser3                   | f        | t          | f             | f           | t           | f              | f            |           -1 | md52ba5e0ae8780ff15af2abfb3cc84d3d9 | 
(12 rows)

postgres=# 

ロール(ユーザー)の削除

ロールを削除します。ここでは、 pguser3 のロールを削除しています。

postgres=# DROP USER pguser3;
DROP ROLE
postgres=# 

ロール(ユーザー)の権限変更

ロール(ユーザー)に権限を付与します。ここでは、Superuser の権限を付与しています。

postgres=# ALTER ROLE pguser WITH Superuser;
ALTER ROLE
postgres=# 
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member
 of 
-----------+------------------------------------------------------------+-------
----
 pguser    | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres=# 

ロールに付与した権限を削除する場合には、権限にNo を付けて変更すると権限を削除できます。ここでは、NoSuperuser として Superuser の権限を削除しています。

postgres=# ALTER ROLE pguser WITH NoSuperuser;
ALTER ROLE
postgres=# 
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member
 of 
-----------+------------------------------------------------------------+-------
----
 pguser    | Create role, Create DB, Replication, Bypass RLS            | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres=# 

コマンドヘルプ表示

ALTER ROLE コマンドのヘルプを表示します。

postgres=# \h ALTER ROLE
Command:     ALTER ROLE
Description: change a database role
Syntax:
ALTER ROLE role_specification [ WITH ] option [ ... ]

where option can be:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED ] PASSWORD 'password'
    | VALID UNTIL 'timestamp'

ALTER ROLE name RENAME TO new_name

ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] SET config
uration_parameter { TO | = } { value | DEFAULT }
ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] SET config
uration_parameter FROM CURRENT
ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] RESET conf
iguration_parameter
ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] RESET ALL

where role_specification can be:

    role_name
  | CURRENT_USER
  | SESSION_USER

postgres=#