LoginSignup
91

More than 5 years have passed since last update.

PostgreSQLでユーザー(ロール)を追加してテーブルにアクセスする

Last updated at Posted at 2016-11-18

■前提

開発用に適当なユーザーを追加して作業がしたい場合にユーザーを追加する方法。

初めて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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
91