サーバーJava入門先頭  H2 DB編先頭
2008-1-5作成

 ■H2 DB ユーザー管理

 ここではH2 Database Engineの、ユーザー管理方法について説明します。

 ・パスワードの変更

 これまでの説明ではデータベースへの接続などには、デフォルトの管理者ユーザーである sa を使用してきました。
 始めにこのデフォルト管理者ユーザーに対し、パスワードを設定することから始めましょう。そのためには ALTER USER 文で SET PASSWORD キーワードを使います。 sa ユーザーのパスワードを adm に設定するサンプルSQLは、次の通りです。

ALTER USER sa SET PASSWORD 'adm';

 逆にパスワードを無しにする場合は、

ALTER USER sa SET PASSWORD '';

とします。

 ・新規ユーザーの作成

 次に新しいユーザーを作成しましょう。例として yok_adm (管理者ユーザーにする予定です)を作成し、パスワードは adm とするサンプルSQLを示します。

CREATE USER yok_adm PASSWORD 'adm';

 この CREATE USER 文ですが PASSWORD パラメータは必須項目です。もしも新しいユーザーを作成し、パスワード無しにしておきたいときは次のようにしてください。

CREATE USER yok_adm PASSWORD '';

 なおパスワード指定時は必ず ' で囲むので、間にスペースが含まれているパスワードを設定することも出来ます。またパスワードは大文字小文字も区別されます。
 これは先ほどの ALTER USER で、パスワードを変更する際にも言えることです。

 ・既存ユーザーの削除

 ちなみに既存ユーザーを削除する場合は、

DROP USER ユーザーID ;

です。このとき

DROP USER IF EXISTS ユーザーID ;

と、 IF EXISTS キーワードを指定すると、指定したユーザーIDが存在する場合のみ削除されます。存在しないときは、リタンコードは0で終了するだけで何も起こりません。逆に IF EXISTS を指定しないで存在しないユーザー名を削除しようとすると、User name not foundのエラーで終了します。

 ・既存ユーザーの表示

 データベースに対して作成済みのユーザーを表示するには、

SELECT * FROM INFORMATION_SCHEMA.USERS
としてください。H2 DBの管理情報(データベース内に作成済みのテーブル、インデックス、ビュー、ユーザー、トリガーなど)は全て、INFORMATION_SCHEMA スキーマに属する管理テーブルで管理されています。この管理テーブルを参照すれば、定義されているものの情報を表示できます。

 ・接続中ユーザーの表示

 ユーザーを複数定義しているとき、どのユーザーIDでログイン中だったか分からなくなることがよくあります。そのときは CURRENT_USER 関数を使い

SELECT CURRENT_USER()
としてください。これは現在操作中のH2 Consoleに対してログイン中の、ユーザーIDを表示してくれます。他に USER 関数があり、こちらは接続中のデータベースに対し、ログイン中の全ユーザーID一覧が表示されます。

 ・管理者ユーザーへの変更

 新規に作成した yok_adm は、管理者ユーザーにする予定でした。そこでこのユーザーIDに管理者権限を与えます。それには ALTER USER 文で ADMIN キーワードを使い、次のように指定します。

ALTER USER yok_adm ADMIN TRUE;

 このADMINキーワードに指定できるパラメータは TRUE か FALSE です。TRUE を指定すれば管理者権限付与、FALSEを指定すれば管理者権限剥奪、の意味です。

 今説明した例のように管理者ユーザーを作成するとき、次のように2つのSQLを続けてH2 Console画面に入力できます。

CREATE USER yok_adm PASSWORD 'adm';
ALTER USER yok_adm ADMIN TRUE;

 つまりユーザー作成と管理者権限付与を、1回の実行で続けて行える、ということです。

 ■管理者権限の内容

 ここで少し管理者権限に関することを、まとめて書いておきます。
 これまで説明した中で、管理者権限が必要なのは次のものです。

  • データベースの作成
  • ユーザーの管理(作成、変更、削除、管理者権限の管理)
  • テーブルの管理(変更、削除)
  • ビューの管理(作成、変更、削除)
  • 権限の管理(テーブル操作権限の、一般ユーザーへの付与、剥奪)
  • SQLスクリプトの実行(RUNSCRIPTコマンドの実行)
  • CSVREADの実行
  • CSVWRITEの実行
  • データベースのバックアップ
  • データベースのリストア
 テーブルやビューを介したデータの操作(作成、参照、更新、削除)を一般ユーザーが実行するには、管理者ユーザーがその対象への権限をユーザーに付与しておく必要があります(ここで言っているのはあくまでテーブル内のデータ操作です、テーブルの構造操作ではありません)。

 今ひとつ理由が分からない、というか納得出来ないことがあります。テーブルに対する操作(作成、参照、更新、削除)のうち、作成だけは権限付与されていない一般ユーザーでも可能です。ただし一般ユーザーでログインし、テーブルを作成しても、そのテーブルにデータを作成(INSERT)したり参照(SELECT)したりすることは出来ません。権限無しのエラーになってしまいます(テーブルの更新(ALTER TABLE)や削除(DROP TABLE)についても同様です)。

 確かに権限管理(付与)はGRANT文で、対象テーブルに関するものをユーザーに与えます。つまり必ず対象テーブルが無いといけません。
 なので一般ユーザーが、権限を付与されていないテーブルに対して、操作が何も出来ないのは分かります。ですが、そもそもテーブルの作成は出来てしまうというのはどうなんでしょう(しかも自分が作成したテーブルに対して何も出来ない、もちろん権限も振れない)。

 これはINFORMATION_SCHEMA.TABLESに対する更新権限を、無くすことが出来れば解決するはずです(テーブルを作成すると、データベース内のテーブルを管理している管理テーブルが更新されることになるので、それへの更新権限を無くす)。
 しかしこの管理テーブルに対する権限管理が可能なユーザーIDが分からないので、このやり方が出来ません。

 ・データベース管理者

 データベース作成時は管理者権限が必要、と挙げましたが、この権限はどのように付与すればよいのでしょう?
 結論を言うと、特に何もする必要はありません。

 データベース作成方法はH2 Console画面で「接続」ボタンを押すときに、新しいデータベースを指定して「接続」ボタンを押すというものです(「接続テスト」ボタンでも同様の結果になります)。すると画面の JDBC URL で指定したデータベースに接続しますが、このとき
 ・指定したデータベースがあればそこに接続する
 ・指定したデータベースが無ければ、そのデータベースを作成する

という動作をします。

 これで新しいデータベースが作成されるわけですが、注意点はこのときに指定するユーザーID(とパスワード)です。新しいデータベースを作成するわけで、当然そのデータベースに対するユーザーは未定義のはずです。

 このデータベース新規作成時に指定したユーザーIDが、そのデータベースに対する管理者権限を持つユーザーとして、同時に作成されます。
 あとはこのユーザーIDを、そのデータベースの管理者ユーザーとして使用できます。
 ユーザーIDはあくまでデータベース単位に紐付くものです。ですからあるデータベースで管理者権限をもっていても、同じユーザーIDで他のデータベースにアクセスすることはできません(接続もできないということです)。これはデフォルトで表示されている sa ユーザーでも同じことです。作成時にsa以外のユーザーIDで作成し、その後saというユーザーIDを作成していない以上、saでは接続もできません。

 ちなみにデフォルトのsaユーザーですがsystem administratorから取っているのでしょう。しかしH2 DBにはシステム全体を管理する管理者IDというのはありません(ソースから探せばあるかもしれませんが公開はされていません)。OracleなどのsysinternalのようなユーザーIDは無い、ということです。あくまでデータベース単位の管理者ユーザーを、自分で定義し管理することが必要です。

 ・内部ユーザーID管理

 ユーザーIDはあくまでデータベース単位に管理されます。例えばあるデータベースと、別のデータベースで同じユーザーIDを定義します。そうしておけば同じユーザーIDで、複数のデータベースに接続できます。しかし実際にはこれは、同じユーザーIDで複数DBに接続できているように、見えているだけです。

 H2 DB内部では、ユーザーIDはいわば表示名として扱われ、内部管理用IDは別に振られています。例えばdb1データベース作成時にデフォルトのsaユーザーを使い、別のdb2データベース作成時も同じsaユーザーを使ったとします。
 そうすると同じデフォルトのsaユーザーで両方のデータベースに接続できているように見えますが、db1のsaユーザーとdb2のsaユーザーは、内部管理用IDは別なのです。ですからどちらかのデータベース接続中にDROP USER saを実行しても、もう片方のデータベースには何の影響も与えません。

 ・管理者ユーザーIDの管理

 では管理者ユーザーIDはどのように決めて管理するのが効果的でしょうか。
 「データベース管理者」で説明したようにH2 DBでは、全体を管理(操作)出来る管理者ユーザーIDは存在しません。あくまでデータベース単位です。なのでもしもあるデータベース上に作成した管理者ユーザーIDを忘れてしまうと、そのデータベースに対しては作業が出来なくなります。

 忘れにくくするためには、次のどちらかの方法が安全だと思います。

(1) 全データベースに対して同じ管理者ユーザーIDを振る
 新規にデータベースを作成するときは、必ず同じユーザーIDを使う方法です。管理者用ユーザーIDの表示名は全データベースで同じなので、忘れる心配は無くなります。

(2) 管理者ユーザーIDをデータベース名と対応付ける
 例えば「DB名_ad」など、作成しようとするデータベース名と対応付いたユーザーIDを使うように決めておきます。これをそのデータベースの管理者ユーザーIDとして使用する方法です。データベース名と結びついているので、忘れる心配は無いでしょう。

 「H2 DB ユーザー管理2」に続く


このページの先頭  技術メモ先頭  サーバーJava入門先頭  H2 DB Engine編先頭
Copyright © 2007 YOK. All Rights Reserved.