次に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 を作ります。これは業務処理間でのデッドロック回避の確認に使用します。
「■権限の管理」で権限付与や権限剥奪時の、対象ユーザーの説明で 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に対してアクセス可能なテーブルを管理するのではなく、実行可能な業務機能を管理する、という仕組みです。直接テーブルに対して権限管理をするのではなく、テーブルにアクセスする業務機能(プログラム)への権限管理を行う、といった形です。