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

 ■H2 DB ユーザー管理2

 ■権限について

 次にH2 DBで管理できる権限の種類について説明します。

 H2 DBで管理出来る権限は、テーブルに対するものだけです。そしてOracleやMySQLのような細かい権限設定は出来ません。必要最低限の権限設定に絞ってあると言えるでしょう。

 「管理者権限の内容」でも軽く触れておきましたが、基本的に初期状態では次の通りです。
・管理者権限を持っているユーザーIDは、そのデータベースに対して何でも出来ます。
・一般ユーザーは管理者ユーザーIDから権限を割り振られないと、テーブルの作成以外何も出来ません(自分で作成したテーブルに対しても、データ操作も出来ません)。

 H2 DBで管理できる権限、つまりテーブルに対して設定できる権限は次のものだけです。

テーブルに設定できる権限
権限名 説明
作成(INSERT)  対象テーブルに対し、新しいデータ(行)を作成(追加)出来る。
参照(SELECT)  対象テーブルのデータ(行)を参照出来る。
更新(UPDATE)  対象テーブルのデータ(行)を更新出来る。
削除(DELETE)  対象テーブルのデータ(行)を削除出来る。
全て(ALL)  対象テーブルに対し、上記全てのことが出来る。

 この基本的な権限種類を別の言い方ではCRUD(クラッドと読む)と呼びます。CRUDとは次の単語の頭文字です。
Create
Read
Update
Delete
:データの作成
:データの参照
:データの更新
:データの削除

 特に外部設計とか基本設計という局面で、このCRUDを使った表を作成します。例えば縦軸にテーブルの一覧、横軸にシステム化対象業務を記述した表を作り、その交点のマスにC,R,U,Dを記述したものをCRUD表と呼びます。システム化対象の各業務でどのテーブルをどのように扱うかを整理したり、業務間でデータ整合性に問題がないかを調べるのに使います。
 また例えば縦軸にテーブルを置く場合、その順番を対象業務の処理手順に沿って並べたCRUDを作ります。これは業務処理間でのデッドロック回避の確認に使用します。


 ■権限の管理

 あるテーブルに対する権限を割り当てる、付与するには、 GRANT 文を使用します。
 また付与済みの権限を剥奪するには、 REVOKE 文を使用します。

権限管理SQL構文
SQLコマンド 説明
GRANT 権限付与
GRANT 権限名 ON テーブル名 TO 対象ユーザー
権限名 SELECTINSERTUPDATEDELETEALLのいずれか。
 ALL以外のときは , で区切って複数指定できる。
 例えば削除以外の権限を指定するときは、 SELECT,INSERT,UPDATE と指定する。
テーブル名 権限付与の対象テーブルを指定する。
 テーブル名を , で区切って複数指定できる。
対象ユーザー 権限を付与する対象ユーザーID、もしくはROLE(後述)を指定する。
 PUBLICを指定した場合、全ユーザーが対象になる。
REVOKE 権限剥奪
REVOKE 権限名 ON テーブル名 FROM 対象ユーザー
権限名 SELECTINSERTUPDATEDELETEALLのいずれか。
 ALL以外のときは , で区切って複数指定できる。
 例えば削除以外の権限を指定するときは、 SELECT,INSERT,UPDATE と指定する。
テーブル名 権限剥奪の対象テーブルを指定する。
 テーブル名を , で区切って複数指定できる。
対象ユーザー 権限を剥奪する対象ユーザーID、もしくはROLE(後述)を指定する。
 PUBLICを指定した場合、全ユーザーが対象になる。


 ■ロール(役割)について

 「■権限の管理」で権限付与や権限剥奪時の、対象ユーザーの説明で ROLE(ロール)と言う言葉が出てきました。ROLE(ロール)を一言でいえば、役割です。
 これはMySQLでは出てこない概念ですが、複数ユーザーIDを定義して使い分けるときに、うまく使うと大変便利な概念です。
 例えばGRANT文やREVOKE文で権限管理をする場合、複数ユーザーに対して一度に権限設定をすることは出来ません。権限設定をしたいユーザーIDの数だけ、これらのSQLを実行する必要があります。

 ROLEを使う場合の要点はユーザーIDを分類分けし、その分類毎に権限付与を行えるようにする、というものです。
 典型的な例としては、データの更新は出来ないけれども参照だけは出来るユーザー分類を作る、というものです。(マニュアルにも出ているのですが)この参照のみ可能なユーザー分類にREADONLYという ROLE 名を付けることにします。
 この場合はGRANT文の対象ユーザーを指定する部分にROLEを使い、例えば
GRANT SELECT ON 対象テーブル1,対象テーブル2,・・・ TO READONLY
とします。
 そしてユーザーIDを作成したあとGRANT文を使い、
GRANT READONLY TO 対象ユーザーID
としてROLE名を割り振ります。これによってユーザーIDを分類分けし、その分類(役割)に対応したROLE(役割)に参加させることが出来ます。

 結局のところ、ユーザーID毎にGRANT文を発行する必要はあります。その内容がテーブルに対する権限を直接指定したものか、参加させる役割を指定するか、の違いです。
 例えば新しいテーブルを作成したときに、そのテーブルに対する権限設定をユーザーID毎に設定するのではなく、ROLE毎にまとめて設定できます。
 新しいユーザーIDを作成したときも、既存テーブルに対して複数の権限設定を実施する必要はありません。ユーザーIDが属する分類(ROLE)を設定するだけです(ユーザーIDを作成する場合、そのユーザーIDがどんな分類に属するかは、事前に決定されているはずです)。

ROLE設定のSQL構文
SQLコマンド 説明
CREATE ROLE作成
CREATE ROLE [IF NOT EXIST] ROLE名
ROLE名 作成するROLE名。
 IF NOT EXISTが指定されている場合は、作成しようとしているROLE名が存在しないときのみ作成する(既に存在する場合は何も行われず、エラーにもならない)。
GRANT ROLE付与
GRANT ROLE名 TO 対象ユーザー
ROLE名 作成済みのROLE名。
対象ユーザー ROLEを付与する対象ユーザーID、もしくはROLEを指定する。
 PUBLICを指定した場合、全ユーザーが対象になる。
REVOKE ROLE剥奪
REVOKE ROLE名 FROM 対象ユーザー
ROLE名 作成済みのROLE名。
対象ユーザー ROLEを剥奪する対象ユーザーID、もしくはROLEを指定する。
 PUBLICを指定した場合、全ユーザーが対象になる。

 構文を見て分かるように、既存のROLEに対してさらに別のROLEを割り振ることができます。ということは階層構造を持った権限構造を作成することができます。

 実際のところこのROLEが役立つのは、複数ユーザーIDを使い分ける場合です。それもEUC(エンドユーザーコンピューティング)のように、ODBCやJDBC経由でH2 DBのデータベースへのアクセスを解放していて、ユーザー個々にDBユーザーIDを振るような場合でしょう。

 データベースへのアクセスが業務システムを介してのみの場合、特にサーバーJavaを使用していて、Connection Poolを使うときはそれほどメリットが無いかもしれません。
 なぜならこのような場合は、業務システムへのログインユーザーIDと、DBユーザーIDを1:1にすることはまれだからです。DBユーザーIDは業務システム単位に定義したものを、複数ログインユーザーIDで使い回す方が多いと思います。とりわけJ2EEでConnection Poolを使うときはそうせざるを得ません。

 こうした場合はデータベース(テーブル)へのアクセス制御は、DBMS(データベース管理システム)の権限管理機能は使いません。全てアプリケーションの認証サブシステムで行うことになります。
 ログインユーザーIDに対してアクセス可能なテーブルを管理するのではなく、実行可能な業務機能を管理する、という仕組みです。直接テーブルに対して権限管理をするのではなく、テーブルにアクセスする業務機能(プログラム)への権限管理を行う、といった形です。




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