■H2 DB ユーザー管理ここではH2 Database Engineの、ユーザー管理方法について説明します。 ・パスワードの変更
これまでの説明ではデータベースへの接続などには、デフォルトの管理者ユーザーである sa を使用してきました。
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 '';
なおパスワード指定時は必ず ' で囲むので、間にスペースが含まれているパスワードを設定することも出来ます。またパスワードは大文字小文字も区別されます。
・既存ユーザーの削除ちなみに既存ユーザーを削除する場合は、
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回の実行で続けて行える、ということです。
■管理者権限の内容
ここで少し管理者権限に関することを、まとめて書いておきます。
今ひとつ理由が分からない、というか納得出来ないことがあります。テーブルに対する操作(作成、参照、更新、削除)のうち、作成だけは権限付与されていない一般ユーザーでも可能です。ただし一般ユーザーでログインし、テーブルを作成しても、そのテーブルにデータを作成(INSERT)したり参照(SELECT)したりすることは出来ません。権限無しのエラーになってしまいます(テーブルの更新(ALTER TABLE)や削除(DROP TABLE)についても同様です)。
確かに権限管理(付与)はGRANT文で、対象テーブルに関するものをユーザーに与えます。つまり必ず対象テーブルが無いといけません。
これはINFORMATION_SCHEMA.TABLESに対する更新権限を、無くすことが出来れば解決するはずです(テーブルを作成すると、データベース内のテーブルを管理している管理テーブルが更新されることになるので、それへの更新権限を無くす)。
・データベース管理者
データベース作成時は管理者権限が必要、と挙げましたが、この権限はどのように付与すればよいのでしょう?
データベース作成方法はH2 Console画面で「接続」ボタンを押すときに、新しいデータベースを指定して「接続」ボタンを押すというものです(「接続テスト」ボタンでも同様の結果になります)。すると画面の JDBC URL で指定したデータベースに接続しますが、このとき
これで新しいデータベースが作成されるわけですが、注意点はこのときに指定するユーザーID(とパスワード)です。新しいデータベースを作成するわけで、当然そのデータベースに対するユーザーは未定義のはずです。
このデータベース新規作成時に指定したユーザーIDが、そのデータベースに対する管理者権限を持つユーザーとして、同時に作成されます。
ちなみにデフォルトのsaユーザーですがsystem administratorから取っているのでしょう。しかしH2 DBにはシステム全体を管理する管理者IDというのはありません(ソースから探せばあるかもしれませんが公開はされていません)。OracleなどのsysinternalのようなユーザーIDは無い、ということです。あくまでデータベース単位の管理者ユーザーを、自分で定義し管理することが必要です。 ・内部ユーザーID管理ユーザーIDはあくまでデータベース単位に管理されます。例えばあるデータベースと、別のデータベースで同じユーザーIDを定義します。そうしておけば同じユーザーIDで、複数のデータベースに接続できます。しかし実際にはこれは、同じユーザーIDで複数DBに接続できているように、見えているだけです。
H2 DB内部では、ユーザーIDはいわば表示名として扱われ、内部管理用IDは別に振られています。例えばdb1データベース作成時にデフォルトのsaユーザーを使い、別のdb2データベース作成時も同じsaユーザーを使ったとします。
・管理者ユーザーIDの管理
では管理者ユーザーIDはどのように決めて管理するのが効果的でしょうか。
忘れにくくするためには、次のどちらかの方法が安全だと思います。
(1) 全データベースに対して同じ管理者ユーザーIDを振る
(2) 管理者ユーザーIDをデータベース名と対応付ける
|