環境
Utuntu22.4
PostgreSQL17
内容
PostgreSQLにログインするのに、一番手っ取り早い方法はこれになります。
$sudo su postgres
$psql
ただ呪文のように覚えていても意味がないため、このコマンドについて少し考察してみよう。
疑問その1
ユーザーを切り替えるときに、root権限で切り替えるのはなぜでしょうか。su postgresだけではユーザーを切り替えることはできません。あくまでもデフォルトの状態ではという条件付きではありますが。
PostgreSQLをインストールすると、postgresユーザーが自動で追加されます。しかし、このときにパスワードは設定されていません。/etc/shadowを見ると、設定されているように見えますが、実際には設定されていません。自分で変更すればいいのですが、デフォルトの状態であれば、postgresユーザーのパスワードを求められて、そのままEnterを押してもログインはできません。パスワードが設定されていないということは、空白のパスワードが設定されているという意味合いとはまた異なるからです。
疑問その2
postgreユーザーであればPostgreSQLにログインするときに、オプションをすべて省略してpsqlコマンドだけでログインできるのはなぜでしょうか。
psqlだけでログインするには、少なくてもデータベース名とユーザーを指定する必要があります。
データベース名を省略すると、OSにログインしているユーザー名と同じデータベース名で接続しようとします。また、ユーザー名を省略すると、OSにログインしているユーザー名と同じユーザー名で接続しようとします。
つまり、postgreユーザーでログインしている場合、psqlコマンドだけで、つぎのコマンドを入力したことと同じことになるのです。
>psql -d postgres -U postgres
疑問その3
postgresユーザーに切り替えることなく、別のユーザーでOSにログインしている状態で、つぎのコマンドでPostgreSQLにログインできないのはなぜでしょうか。
>psql -U postgres -d postgres
その答えは、pg_hba.confを見るとわかります。デフォルトの状態ではpostgresユーザーの認証はpeer認証になっています。peer認証とは、OSログインしているユーザーと同じユーザー名でPostgreSQLにログインしないと認証が通らないようにする仕組みのことです。
これを解決させるには、pg_haba.confでmd5認証(一例です)に変更するか、postgresql以外のユーザーをPostgreSQLで作成するかになります。
例えば、vagrantユーザーでOSにログインしている場合、PostgreSQLでOSと同じvagrantユーザーを追加してやれば、つぎのコマンドでPostgreSQLにログインすることができます。このときはpeer認証を行っています。
当然ではありますが、デフォルトで用意されているpostgresデータベースが存在していなければログインができなくなります。開発用で新しいデータベースを作成しても、postgresデータベースだけは削除しないで残しておいた方が何かと便利だということです。
>psql -d postgres -U vagrant
繰り返しになりますが、ログインしているユーザーと同じ名前のデータベースが存在していれば、つぎのコマンドだけでログインができます。postgresどうしだけでなく、hogoどうしであっても同じようにログインができます。pg_hba.confをみると、デフォルトではallユーザーもまた、peer認証になっているからです。
>psql