PostgreSQLで新しくデータベース・ユーザー・テーブルを作成する

psqlを使ってPostgreSQLに接続し、新しくデータベース・ロール(ユーザー)・テーブルを作成します。また、権限がなく作成したデータベースに接続できない場合は、所有者を変更します。

postgresロールで接続する(psql)

sudo -u postgres psql

postgresロール以外をパスワード認証に変更

一般ロールがログインしやすいように、ローカルでの接続を、peer認証からパスワード認証に変更します。

~$ psql -U role_name -d newdb                      
psql: FATAL:  ユーザ "role_name" で対向(peer)認証に失敗しました

パスワード認証に変更しないと、こんな感じで接続に失敗します。

pg_hba.confファイルの設定

まずは、pg_hba.confがどこにあるか調べます。

postgres=# show hba_file;
              hba_file               
-------------------------------------
 /etc/postgresql/11/main/pg_hba.conf
(1 行)

postgres=# \q
sudo nano /etc/postgresql/11/main/pg_hba.conf 

peerをmd5に変更します。

# "local" is for Unix domain socket connections only
local   all             all                                     peer

# "local" is for Unix domain socket connections only
local   all             all                                     md5

設定を反映させるために、PostgreSQLを再起動します。

sudo systemctl restart postgresql

新しくデータベースを作成する

sudo -u postgres psql
postgres=# create database newdb;

作成したデータベースを確認

postgres=# \l
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |     アクセス権限      
-----------+----------+------------------+-------------+-------------------+-----------------------
 newdb     | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | 
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | 
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres

新しくロール(ユーザー)を作成する

postgres=# create role role_name with login password 'login_pass';

作成したロールを確認

postgres=# \du
                                              ロール一覧
 ロール名  |                                    属性                                    | 所属グループ 
-----------+----------------------------------------------------------------------------+--------------
 postgres  | スーパーユーザ, ロール作成可, DB作成可, レプリケーション可, RLS のバイパス     | {}
 role_name |                                                                            | {}

作成したロールで接続

psql -U role_name -d newdb

新しくテーブルを作成する

newdb=> create table new_table (id serial, name varchar(255), primary key(id));

作成したテーブルを確認

newdb=> \dt
              リレーション一覧
 スキーマ |   名前    |    型    |  所有者   
----------+-----------+----------+-----------
 public   | new_table | テーブル | role_name
newdb=> \d
                   リレーション一覧
 スキーマ |       名前       |     型     |  所有者   
----------+------------------+------------+-----------
 public   | new_table        | テーブル   | role_name
 public   | new_table_id_seq | シーケンス | role_name
newdb=> \d new_table
                                   テーブル "public.new_table"
  列  |           型           | 照合順序 | Null 値を許容 |              デフォルト               
------+------------------------+----------+---------------+---------------------------------------
 id   | integer                |          | not null      | nextval('new_table_id_seq'::regclass)
 name | character varying(255) |          |               | 
インデックス:
    "new_table_pkey" PRIMARY KEY, btree (id)

所有者を変更

データベース

postgres=# alter database newdb owner to role_name;

所有者の変更を確認

postgres=# \l
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |     アクセス権限      
-----------+----------+------------------+-------------+-------------------+-----------------------
 newdb     | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | 
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | 
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres

postgres=# alter database newdb owner to role_name;
ALTER DATABASE

postgres=# \l
                                          データベース一覧
   名前    |  所有者   | エンコーディング |  照合順序   | Ctype(変換演算子) |     アクセス権限      
-----------+-----------+------------------+-------------+-------------------+-----------------------
 newdb     | role_name | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | 
 postgres  | postgres  | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | 
 template0 | postgres  | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |           |                  |             |                   | postgres=CTc/postgres
 template1 | postgres  | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |           |                  |             |                   | postgres=CTc/postgres

テーブル

newdb=# alter table new_table owner to postgres;

所有者の変更を確認

postgres=# \c newdb
データベース "newdb" にユーザ "postgres" として接続しました。
newdb=# \dt
              リレーション一覧
 スキーマ |   名前    |    型    |  所有者   
----------+-----------+----------+-----------
 public   | new_table | テーブル | role_name
(1 行)

newdb=# alter table new_table owner to postgres;
ALTER TABLE

newdb=# \dt
              リレーション一覧
 スキーマ |   名前    |    型    |  所有者  
----------+-----------+----------+----------
 public   | new_table | テーブル | postgres
(1 行)