結論だけを最初に
- Linux のユーザ名と同じ名前のロール*1が作られてなければいけない
- Linux のロールと同じ名前のデータベースが作られてなければいけない
- ロールやデータベースを作成するためには
postgres
という特別なユーザでログインする必要がある postgres
ユーザでログインするためにはシェルで操作するユーザをpostgres
にしなければいけない- 上記にはもちろん例外ありです
MySQL から PostgreSQL へ
両方の RDBMS とも RDB としては大半の機能が同じですが、ユーザ*2周りなどで自分がハマったことをずらずらと書いていきます。
まず用語として押さえておかないとドキュメント類を読むときに問題となる語として「ロール」という語があります。これは「ユーザ」とほぼ同義です。これだけは押さえておきましょう。
なお、以下の説明は Ubuntu 16.04 LTS 上でのものです。
一番最初の最初のログイン
一般ユーザ(以下、foobar とします)で sudo apt-get install postgresql
したあとにまずは psql
コマンドを実行することになるでしょう。が、ここでいきなりつまずくはずです。ログインできません。
$ psql psql: FATAL: role "foobar" does not exist
「ロール」が登録されていないと怒られます。前述のとおりこれは「foobar というユーザが登録されていない」ということです。どうやってロールを登録したらいいでしょうか。
まずは PostgreSQL の中にログインする
PostgreSQL の中に入れなければロールは作ることができません。一番初めに PostgreSQL に入れるのは postgres
という特別なユーザです。
postgres
というユーザでログインするためにはどうしたらいいのか? foobar
というユーザをシェルで操作している限りはログインできず、自分がシェルで操作するユーザを postgres
にする必要があります。
$ sudo su postgres [sudo] postgres のパスワード:
ユーザ変更ができれば psql
コマンドを実行するだけで PostgreSQL の中に入ることができます。
$ psql psql (9.5.14) Type "help" for help. postgres=#
ロールを作る
ログインできたならロールを作ります。ロールには細かく権限を与えることができます。
ここではログインができるだけの権限を与えてロールを作成します。なおパスワードを付与していませんが、これは Peer認証という方式で認証を行っているためです。認証の方式には様々なものがあり必要に応じて変更ができます。
また、特別に権限を指定していない場合、テーブルやスキーマへのアクセス権限は全開放です。
postgres=# CREATE ROLE foobar WITH LOGIN;
ロールの一覧は psql
のプロンプトで \du
コマンドを実行すればよいです。必要に応じて確認してみてください。
postgres=# \du List of roles Role name | Attributes | Member of -----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {} foobar | Superuser | {} (以下省略)
改めて PostgreSQL にログインする
psql
のプロンプトで \q
を実行すると psql
から抜けられます。その後、シェルで操作するユーザも foobar
に戻しておきましょう*3。
そうしたら改めて psql
してログインを試みます。
$ psql psql: FATAL: database "foobar" does not exist
……また怒られました。エラーメッセージのとおり「foobar という名前(=ロールと同じ名前)のデータベースが存在しない」とのことです。となると。foobar
というデータベースを作らなければいけません*4。
どうやってデータベースを作るのか?
postgres というルートユーザでログインする
ロールを作る場合と同様、データベースを作るためには postgres
という特別なユーザでログインする必要があります。postgres
というユーザでログインするためにはどうしたらいいのか? foobar
というユーザからはログインできないため、自分がシェルで操作するユーザを postgres
にする必要があります*5。
$ sudo su postgres [sudo] postgres のパスワード:
ユーザ変更ができれば psql
コマンドを実行するだけで PostgreSQL の中に入ることができます。
$ psql psql (9.5.14) Type "help" for help. postgres=#
データベースを作る(実はここは任意です)
PostgreSQL にログインできたのでデータベースを作成しましょう。ユーザ名と同じ foobar
という名前のデータベースを作ります。データベースの作成コマンドは MySQL と同じ感じです。
postgres=# CREATE DATABASE foobar; CREATE DATABASE
現在作られているデータベースを確認するには \l
コマンドを用います。必要であれば確認してみてください。なお、シェルから psql -l
というコマンドでも確認できます。
postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- foobar | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | (以下省略)
改めてログインする
ここまでできたら psql
から抜け、シェルの操作ユーザを foobar
に戻します。そして PostgreSQL にログインしてみます。
$ psql psql (9.5.14) Type "help" for help. foobar=>
無事にログインできました!
この先へ
ここまでできたらだいたい勘どころがつかめたかと思います。ロールとその権限や、ロールの認証方式、データベースとスキーマの概念などが MySQL からやってきた場合に戸惑うと思いますが*6、ここまで来られたなら大丈夫だと思います*7。
なお、外部から接続する場合はこちらの記事も参考にしてみてください。