レベル: 初級 村井 修一, 情報マネジメント技術/ソフトウェア開発研究所, IBM
2005年 12月 09日
2005年9月のDB2 Alphablox特集において、DataBlox、PresentBlox等代表的なBloxを利用しながら、リレーショナル・データベースや、DB2 Cube Viewsに接続して分析するアプリケーションの開発方法を説明しました。DB2 Cube ViewsのほかにもIBM DB2 OLAP ServerやHyperion Essbase等のOLAPサーバーに接続しての多次元分析アプリケーション開発も同様に、DataBloxとPresentBloxを使って容易に行えます。なお、キューブの中には複雑なアウトラインや多数のメンバーが含まれており、場合によっては表示させたくないものもあります。今回はログイン・ユーザーによってアクセスさせるアウトラインを制御する方法について解説します。
多次元分析アプリケーションの作成
OLAPサーバーに接続して多次元分析をするアプリケーションの開発は、リレーショナル・データベースやDB2 Cube Viewsと同様にDataBloxとPresentBloxを用いて容易に行えます。DataBloxとPresentBloxについては、過去の記事を参照してください。
今回作成するアプリケーションの内容
図1のようなアウトラインを持ったキューブがあります。 全国の各営業所がこのキューブにアクセスし、その営業所が所在する地方の売上データ等を分析する多次元アプリケーションを開発することを目標にします。
このアプリケーションは以下のような条件を持っているとします。
- 各営業所は、自分の所在する地方のデータのみにアクセスできる。
- 自分の所在する地方以外のデータは見えない。
ユーザーIDを営業所ごとに管理した上に営業所ごとに地域(MARKETの別名)次元以下のアクセスできる各地方メンバーを定義できれば、これらの条件が実現できます。OLAPサーバーにはこのような条件が実現できるフィルタリング機能が用意されていますが、なかでも便利な「メタ読み込み」フィルタリング機能はDB2 Alphablox (以降 Alphablox) Version 8.2.1 ではサポートされていません。
しかしAlphabloxにもフィルタリング機能が用意されており、アプリケーションによる制御が可能です。さまざまな方法がありますが、ここではJSPファイル1つで手軽に実現できる方法を紹介します。
図1.キューブのアウトライン
アプリケーションを以下の手順で作成していきます。
- OLAPクライアント・ライブラリーの設定
- OLAPデータソースの定義
- JSPファイルの作成
- カスタム・プロパティーとグループ・プロパティーの設定
- RepositoryBloxの利用
- 仮想ルートの定義
OLAPクライアント・ライブラリーの設定
Alphabloxには、さまざまなOLAPサーバーのクライアント・ライブラリーが用意されており、導入時点ではDB2 OLAP Server Version 8.1 または Hyperion Essbase Version 6.5に設定されています。 必要に応じて、OLAPクライアント・ライブラリー・ユーティリティを利用して接続するOLAPのバージョンに合わせておきます。OLAPクライアント・ライブラリー・ユーティリティーの使用方法については Alphablox管理者用ガイドの「基本管理タスク」-「Essbaseクライアント・ライブラリー・ユーティリティー」の節を参照してください。
OLAPデータソースの定義
Alphablox管理画面で、OLAPサーバーに接続するためのデータソースを定義します。これはAlphablox管理者用ガイドの「データソースの定義」の節に従って行います。
JSPファイルの作成
まず手始めとして、関東地方の各製品のデータを表示するページを作成します。
-
Alphablox管理画面で作成されたデータソース名を指定します。
-
別名でメンバー値を使用するようにします。 useAliasesプロパティのデフォルト値はfalseです。
-
関東地方のデータを取得するための照会文を定義します。次元、メンバー名は別名を使用します。
<HTML>
<HEAD>
<%@ taglib uri="bloxtld" prefix="blox" %>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="SHIFT_JIS" %>
<blox:header />
</HEAD>
<blox:data
id="dataBlox"
dataSourceName="CAR_OLAP" - 1
useAliases="true" - 2
query="<COLUMN (\"地域\", \"製品\") <SYM <CHILD \"関東\"
<ICHILD \"製品\" <ROW (\"時間\") \"時間\" !" - 3
/>
<BODY>
<blox:present
width="100%"
height="500"
id="presentBlox">
<blox:data
bloxRef="dataBlox"/>
<blox:chart
title="関東" />
</blox:present>
</BODY>
</HTML>
|
このJSPファイルをAlphabloxアプリケーションに配置して、ブラウザーからアクセスすると、図2.のように関東地方メンバーの子メンバーである各県メンバーが表示されます。
図2.PresentBloxの表示
カスタム・プロパティーとグループ・プロパティーの設定
Alphabloxでは、以下のような機能が提供されています。
- カスタム・プロパティー機能
- ユーザー、グループによるセキュリティ機能
これらの機能を組み合わせることによって、ユーザーまたはグループごとに参照したい地方メンバーを定義し、アプリケーションから参照することが可能となります。
それぞれの機能についてはAlphablox管理者用ガイドの「ユーザーの定義」、「グループの定義」、「DB2 Alphabloxプロパティーの構成」の各節を参照してください。
以下の手順でカスタム・プロパティーとグループを関連付けします。
- カスタム・プロパティーの登録
Alphablox管理画面で、「General」タブ内の「User Definitions」を選択し、「Create」ボタンをクリックします。図3.のように、userRegionというプロパティーを定義して登録します。
図3.カスタム・プロパティーの定義
- ユーザーの登録
Alphablox管理画面の「Users」タブ内で、ログインで使用されるユーザーIDを登録します。 登録時に1.で作成したカスタム・プロパティーの定義フィールドが現れますので、ユーザーごとにアクセスできる地方メンバーを定義できます。ここでは営業所ごとにアクセスできる次元を定義するので、ここでの定義を省略できます。
図4.ユーザーの登録
- グループの登録
Alphablox管理画面の「Groups」タブ内でグループを営業所単位で登録します。 登録時に1.で作成したカスタム・プロパティーの定義フィールドが現れますので、グループごとにアクセスできる地方メンバーを定義できます。図5.では関東地方営業所用グループとして、kantoグループを作成し、メンバーにmuraiとuser1の各ユーザーを指定、userRegionプロパティーの値を「関東」にしています。
図5.グループの登録
RepositoryBloxの利用
カスタム・プロパティーやユーザー、グループ等の情報はAlphabloxのリポジトリーに保管されます。 RepositoryBloxは、このリポジトリーに保管されているデータを読み込んだり保管したりするためのBloxです。
RepositoryBloxには定義したユーザーまたはグループのカスタム・プロパティーの値を取得するためのメソッドgetUserProperty()、getGroupProperty()を提供しています。RepositoryBloxについては、開発者用リファレンスの「PresentBloxリファレンス」の節を参照してください。
以下の手順でJSPファイルを拡張していきます。
-
RepositoryBloxを定義します。idプロパティーを定義することで、RepositoryBloxのオブジェクト名を付けます。
-
RepositoryBloxのgetGroupProperty()メソッドを使って、ログイン・ユーザーが所属するグループに関連付けられたuserRegionプロパティーの値を取得します。ユーザーに関連付けられたカスタム・プロパティーの値を取得する場合はgetUserProperty()メソッドを使用します。
-
取得したuserRegionプロパティーの値を照会文内の地域次元のメンバーに指定します。
-
(3)で定義した照会文をDataBloxのqueryプロパティーに設定します。
-
ChartBloxのタイトルも動的に変更するようにします。
<HTML>
<HEAD>
<%@ taglib uri="bloxtld" prefix="blox" %>
<%@ page language="java" contentType="text/html;
charset=utf-8" pageEncoding="SHIFT_JIS" %>
<blox:header />
</HEAD>
<blox:repository
id="repositoryBlox" - 1
/>
<%
String userRegion = repositoryBlox.getGroupProperty("userRegion") ; - 2
String query="<COLUMN ('地域', '製品') <SYM <CHILD '" + userRegion + "'
<ICHILD '製品' <ROW ('時間') '時間' !"; - 3
%>
<blox:data
id="dataBlox"
dataSourceName="CAR_OLAP"
useAliases="true"
query="<%= query %>" - 4
/>
<BODY>
<blox:present
width="100%"
height="500"
id="presentBlox">
<blox:data
bloxRef="dataBlox"/>
<blox:chart
title="<%= userRegion %>"/> - 5
</blox:present>
</BODY>
</HTML>
|
ブラウザーからアクセスしてみると、画面は図2. とまったく変わりませんが、ログイン・ユーザーによって地域次元のメンバーとChartBloxのタイトルが変わることがわかります。
ここで、県メンバーをドリルアップし、さらに地方メンバーをドリルアップするとトップルート「地域」に達し、さらにドリルダウンすると他の地方メンバーが表示されてしまいます。 Alphabloxには仮想ルート機能が提供されており、地方メンバーをトップルートにすることによって、これ以上ドリルアップができないよう制御することが可能です。
仮想ルートの定義
DataBloxにdimensionRootプロパティーが提供されており、これを設定することによって仮想的なトップルートの設定が行えます。 このプロパティーを定義して、他の地方メンバーのデータを隠蔽します。
-
dimensionRootの値は、"[次元名]:[メンバー名]" のフォーマットで指定します。 複数の仮想ルートを指定する場合は、"[次元名1]:[メンバー名1],[次元名2]:[メンバー名2],……"とコンマで続けて定義します。今回の例では、"地域:[ユーザーがアクセスできる地方メンバー]"であり、地方メンバーはuserRegionプロパティーの値から取得できます。今回の場合は、次元名は別名を使用することに注意してください。 別名でないMARKETを指定するとフィルタリングが効かずトップルートまでドリルアップができてしまいます。
-
DataBloxの定義部分にdimensionRootプロパティーを追加します。
<HTML>
<HEAD>
<%@ taglib uri="bloxtld" prefix="blox" %>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="SHIFT_JIS" %>
<blox:header />
</HEAD>
<blox:repository
id="repositoryBlox"
/>
<%
repositoryBlox.getGroupProperty("userRegion"));
String userRegion = repositoryBlox.getUserProperty("userRegion") ;
String query="<COLUMN ('地域', '製品') <SYM <CHILD '"
+ userRegion + "' <ICHILD '製品' <ROW ('時間') '時間' !";
String root = "地域:" + userRegion ; - 1
%>
<blox:data
id="dataBlox"
dataSourceName="CAR_OLAP"
useAliases="true"
query="<%= query %>"
dimensionRoot="<%= root %>" - 2
/>
<BODY>
<blox:present
width="100%"
height="500"
id="presentBlox">
<blox:data
bloxRef="dataBlox"/>
<blox:chart
title="<%= userRegion %>"/>
</blox:present>
</BODY>
</HTML>
|
実際にブラウザーでアクセスし、地方メンバーより上にドリルアップを行うと、以下のようなエラーメッセージが表示されることが確認できます。
図6. 仮想的なルート・メンバーに対してドリル・アップした時のエラー

 |
まとめ
以上のようにAlphabloxのカスタム・プロパティー機能と、RepositoryBloxを有効に利用して、複雑なコードを書くことなく、ユーザーごとに表示させるメンバーを制限することが可能となりました。また、紹介した仮想ルート機能は、PageBloxやメンバー・フィルター機能でも効果があります。詳細内容については、以下の参考文献を参考にしてください。 DB2 Alphabloxには今回紹介した機能のほかにもデータセルごとにコメントを埋め込む、コメント管理機能など、複雑な多次元分析をサポートする便利な機能が提供されています。
Alphabloxの素晴らしさはこのデモ・サイトにて確認できますので、ぜひご覧ください。(内容は英語です)
参考文献
以上のドキュメントはDB2 Alphablox Libraryに含まれています。
著者について  | |  | 村井 修一はソフトウェア開発研究所のエンジニアで、Business Intelligenceの分野におけるプロジェクトでの開発・支援業務を担当しています。 |
記事の評価
|