#■前提
開発用に適当なユーザーを追加して作業がしたい場合にユーザーを追加する方法。
初めてPostgreSQLを使って、
テスト用にユーザーを追加して処理を行おうとしたらハマったので書きました。
なお、PostgreSQLではいわゆるユーザーを「ロール」と呼びます。
ロールの追加は基本的に2段階です。
1.ロールを追加する
2.テーブルへの権限を追加する
##・実行環境
Windows10
PostgreSQL 9.6.1
#■ユーザーを追加する
コマンドプロンプトを起動します。
まずはスーパーユーザーでログインします。
psql -U postgres
ユーザーを追加するには以下のコマンドを使います。
CREATE ROLE <ロール名> WITH LOGIN PASSWORD '<パスワード>';
今回は以下のようなユーザーを作成します。
ロール名:role_sample
パスワード:password
postgres=> CREATE ROLE role_sample WITH LOGIN PASSWORD 'password';
※パスワードを囲うシングルクォーテーションを忘れるとエラーになるので注意
postgres=> CREATE ROLE role_sample WITH LOGIN PASSWORD password;
ERROR: "password"またはその近辺で構文エラー
行 1: CREATE ROLE role_sample WITH LOGIN PASSWORD password;
^
#■ユーザーを使う
##・ログインを試す
>psql -U role_sample
ユーザ role_sample のパスワード:
psql: FATAL: データベース"role_sample"は存在しません
作成したばかりのロール名だけでログインしようとすると上記のようなメッセージが表示されます。
##・DBを指定して再度ログイン
>psql -U role_sample -d postgres
ユーザ role_sample のパスワード:
psql (9.6.1)
"help" でヘルプを表示します.
データベースを指定するとログイン出来ます。
(postgresは初めから生成されているデータベスです)
##・SQLの実行
postgres=> select * from pg_shadow;
ERROR: リレーション pg_shadow への権限がありません
現在のrole_sampleロールの状況
ロールは作成され、DBにはログイン出来るが、テーブルへのアクセス権限を持たない状態です。
テーブルにアクセスするためには権限の付与が必要です。
##・テーブルアクセス権限の付与
一度、role_userからログアウトし、postgresでログインしなおします。
GRANT <権限の種類> ON <テーブル名> TO <ロール名>;
権限の種類は、SELECTやUPDATEなどのテーブルに対する操作の名称となります。
詳細は参考サイトを参考にしてください。
複数の権限を設定する場合は、カンマ区切りで権限をつなげます。
role_sample に pg_shadow へのSELECTとINSERT権限を付与します。
postgres=> GRANT SELECT ON pg_shadow TO role_sample;
postgresからログアウトし、role_userで再度ログインします。
>psql -U role_sample -d postgres
ユーザ role_sample のパスワード:
psql (9.6.1)
"help" でヘルプを表示します.
postgres=> select * from pg_shadow;
usename | usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | useconfig
-------------+----------+-------------+----------+---------+--------------+-------------------------------------+------------------------+-----------
postgres | 10 | t | t | t | t | md5633bc3c3d823be2a52d3dff94031e2c2 | |
role_sample | 24593 | f | f | f | f | md566db5a3e78c609bc2f01adcbab20850a | |
(2 行)
今度は正しくデータが取得出来ました。
#■以上
以上です。
今回の肝は、
ユーザーはデフォルトでテーブルへのアクセス権限を持たない
というところかと思います。
それだけ理解していれば、今回の操作は難しくないでしょう。
#■参考
『DB Online』ロール(ユーザー)の作成
http://www.dbonline.jp/postgresql/role/
『PostgreSQLでテーブルに対してのアクセス権限を設定する・GRANT,REVOKE』
http://db.just4fun.biz/PostgreSQL/%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E6%A8%A9%E9%99%90%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%83%BBGRANT,REVOKE.html