2008/02/14

PostgreSQLで参照専用のユーザを作成する

 とある業務システムのデータベースで、参照専用のユーザを作成したときのメモから。そんなわけで、今回の記事はやたら長い上に、興味のない人にはなんも面白くないんでヨロシク。

PostgreSQL(ぽすとぐれすきゅーえる: 発音例)は、BSDライセンスにより配布されているフリーの関係データベース管理システム (RDBMS) である。その名称はIngres の後継を意味する「Post-Ingres」に由来している。単純に「Postgres」や「ポスグレ」と呼称されることも多い。

Wikipedia - PostgreSQLより引用

 まぁ、知ってる人にとっては今さら解説するまでもないオープンソースなデータベースの雄の一つである。
 ──あるのだけれども、恥ずかしながら今までOracle Database一本槍だったボクにとっては馴染みの無いお嬢さんなんである。ま、言い換えれば新しい出会い, 浮気のチャンスというわけ。(──後ろからモニタを覗き込んでる我が妻へ。これはあくまで比喩表現であって、PostgreSQLだのOracle Databaseだのという奇怪な名前の女の子がいるわけではないのだよ、ホントだよ?)

 んで、以下はそのときのメモ。
 ちなみに、ユーザ名だのオブジェクト名だのはダミーである。念のため。

プラットフォーム/環境

OS
Solaris 8
Database
PostgreSQL 7.2
データベース名
dummyDatabase
管理アカウント
adminUser
作成するユーザ
dummyUser

概要

 参照専用のデータベースアカウントの作成。

手順

 まずユーザ定義のためのSQLスクリプトを作成する。
 わざわざ手間をかけてスクリプトを作成するのは次のような理由から。

  • それ自体が作業記録・作業履歴になる
  • 同じような作業をするときに、ちょっと書き換えて再利用できる
  • 備忘録・メモ代わりにもなる
  • 幾つかのコマンド/SQLを組み合わせてやる場合、書き出しておけば実行する前に確認できる
  • コマンド間違えたり、パラメータ間違えたり、行きつ戻りつしがちなので、スクリプトにでもしとかないと手戻りが大きい (これはあんまり褒められた理由じゃないが)

 まぁ、そんなトコである。
 多分、データベースの種類どころかデータベースである/ないを問わず、システム管理者というイキモノの間では習性のように染み付いてる習慣だろうと思うけれども。

 余談はさて置き。
 今回、作成したのは次のようなスクリプトである。ここでは仮にファイル名をcr_user-dummyUser.sqlとしておく。

  \c 'dummyDatabase' adminUser
  
  drop user dummyUser;
  
  create user dummyUser
     with password 'dummyPasswd'
     nocreatedb
     nocreateuser;
  
  
  grant SELECT on TABLE
        dummyTable1,
        dummyTable2,
        dummyTable3
     to dummyUser;
  
  grant SELECT on
        dummyView
     to dummyUser;
  
  \du dummyUser
  \c 'dummyDatabase' dummyUser
  \z

 参照を許可するオブジェクトが、いちいちSQL分の中にべた書きなのは、ちょっと気に入らないけれども。
 Tcl/Tk用のロードモジュールなんかもあるし、外部コマンドの実行なんかもできるんで、ちょっと知恵を使えばこういう保守性の悪いスクリプト書かなくて済むんだろうとは思う。──まぁ、その辺はおいおい勉強ってコトで。

 スクリプトができたら、次のコマンドを実行する。

  psql -a -f cr_user-dummyUser.sql 'dummyDatabase'

 エラーが無ければ、実行結果は次のようになる。

     \c 'dummyDatabase' adminUser

    You are now connected to database dummyDatabase as user adminUser.

     drop user dummyUser;

    DROP USER

     create user dummyUser
        with password 'dummyUser'
        nocreatedb
        nocreateuser;

    CREATE USER

     grant SELECT on TABLE
           dummyTable1,
           dummyTable2,
           dummyTable3
        to dummyUser;

    GRANT

     grant SELECT on
           dummyView
        to dummyUser;

    GRANT

     \du dummyUser
        List of database users
     User name | User ID | Attributes
    -----------+---------+------------
     dummyUser |     101 |
    (1 row)

     \c 'dummyDatabase' dummyUser

    You are now connected to database dummyDatabase as user dummyUser.

     \z
              Access privileges for database "dummyDatabase"
               Table           |       Access privileges
    ---------------------------+-------------------------------
     dummyTable1               | {=,adminUser=arwdRxt,dummyUser=r}
     dummyTable2               | {=,adminUser=arwdRxt,dummyUser=r}
     dummyTable3               | {=,adminUser=arwdRxt,dummyUser=r}
     dummyView                 | {=,adminUser=arwdRxt,dummyUser=r}
    (4 rows)
    

 はい、おしまい。
 アタリマエの話しだけど、実に簡単なもんである。お手軽お手軽。
 まぁ、Oracleみたいにキメ細かい設定はできないけども、逆にそれを必要しない状況の方が大半だし。

参考資料

 今回は次のサイトを参照させてもらった。

0 コメント: