Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
86
Help us understand the problem. What is going on with this article?
@wb773

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

More than 3 years have passed since last update.

■前提

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

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

86
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
wb773

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
86
Help us understand the problem. What is going on with this article?