久しぶりにPostgreSQL使おうとしたら権限まわりでハマりにハマったのでドキュメントをまじめに読んでみる。
ロールと権限
ロール
データベースロールと権限
PostgreSQLには「ロール」という概念がある

こんなやつ。
create role ロール名 (オプション...)
で作る。
ロールには、
- ログイン権限
- スーパーユーザー状態
- データベース作成
- ロールの作成
- パスワード
などがある。
CREATE ROLE
権限
権限設定には GRANT を使う。
これはMySQLにもあった。
権限
ロールのメンバ資格
ロールをグループにすることもできる。
CREATE ROLE joe LOGIN INHERIT; CREATE ROLE admin NOINHERIT; CREATE ROLE wheel NOINHERIT; GRANT admin TO joe; GRANT wheel TO admin;
たとえばこんなSQLを書くと下のような関係になる

- joeロールで接続するとすぐに、joeはadmin権限を”継承”する
- そのデータベースセッションではjoeに直接与えられた権限に加えて、adminに与えられた権限を使用可能
- wheelに与えられた権限は利用できない
- joeは間接的にwheelのメンバだが、admin経由のメンバ資格はNOINHERIT属性を持っているため
SET ROLE admin;
をすると、セッションはadmin権限のみを使用する。joe権限は使用できなくなる。
SET ROLE wheel;
をすると、セッションはwheel権限のみを使用する。joeやadmin権限は使用できなくなる。
元に戻すには以下のどれかを実行する
SET ROLE joe; SET ROLE NONE; RESET ROLE;
データベース管理
データベースの作成
createdbコマンドは、postgreデータベースに接続してCREATE DATABASEコマンドを発行するのと同意
他のユーザーのためにデータベースを作成するにはSQLかコマンドから以下のどちらか。
CREATE DATABASE dbname OWNER rolename; createdb -O rolename dbname
クライアント認証
本題はここで一番ハマッタのがここだけど、ロールとか多少理解すればここもなんとかなるような気がする。
pg_hba.conf というファイルがボスっぽい。
debianのaptitudeで入れたら、 /etc/postgresql/8.3/main/pg_hba.conf にあった。
PostgreSQLはログインしてるUNIXユーザー名とPostgreSQLのユーザー名が同じ名前じゃないと弾かれる設定にデフォルトはなってるぽい?
FATAL: Password authentication failed for user "andym"
こんなエラーでたら、とりあえず pg_hba.confを全部コメントアウトして
local all all trust
って書けばログインできた。公開サーバーなんかではこんなことしないほうがいいと思うよ!
とりあえずこのへん読めってことかな
クライアント認証
pg_hba.confファイル
認証における問題点