(58)【調査した分野】(Int.Cl.,DB名)
ユーザが少なくとも1人ずつ属する複数のテナントによって共用されるアプリケーションから、前記複数のテナントそれぞれの個別のデータを格納するマルチテナント対応型の少なくとも2種類のデータベースへのアクセスを制御するアクセス制御装置であって、
テナントごとに、テナントを一意に識別するテナント識別子と、アクセス対象とするデータベースの種類とを記憶装置により予め記憶するマルチテナント管理データベースと、
前記アプリケーションに入力されると前記アプリケーションが前記少なくとも2種類のデータベースへのアクセス時に出力するパラメータの入力を、前記複数のテナントのいずれかに属するユーザから入力装置により受け付け、当該ユーザが属するテナントのテナント識別子を前記マルチテナント管理データベースから読み出して当該パラメータに埋め込み、当該パラメータを前記アプリケーションに入力するユーザインタフェース接続部と、
前記ユーザインタフェース接続部により入力されたパラメータが前記アプリケーションから出力された場合、当該パラメータに埋め込まれているテナント識別子を取り出し、取り出したテナント識別子に対応するテナントのデータベースの種類を前記マルチテナント管理データベースから読み出し、前記少なくとも2種類のデータベースのうち、読み出した種類のデータベースに格納された当該テナントの個別のデータへのアクセスを前記アプリケーションに行わせるデータベース接続部と
を備えることを特徴とするアクセス制御装置。
前記少なくとも2種類のデータベースは、マルチテナント対応のための構成が互いに異なる複数種類のデータベースからなることを特徴とする請求項1のアクセス制御装置。
前記複数種類のデータベースは、前記複数のテナントそれぞれの個別のデータを、テナント識別子のカラムを含む共通のテーブルに格納することによりマルチテナント対応を行う第1種類のデータベースと、テナントごとに、テナントの個別のデータを個別のテーブルに格納することによりマルチテナント対応を行う第2種類のデータベースと、テナントごとに、テナントの個別のデータを格納する個別のデータベースインスタンスが存在することによりマルチテナント対応を行う第3種類のデータベースとであることを特徴とする請求項2のアクセス制御装置。
前記アプリケーションは、前記複数種類のデータベースに対して第1のクエリを発行することにより前記複数種類のデータベースへのアクセスを行うアプリケーションであり、
前記マルチテナント管理データベースは、前記第1種類のデータベースをアクセス対象とするテナントごとに、前記共通のテーブルに格納されるデータについて設定された条件を予め記憶し、
前記データベース接続部は、前記マルチテナント管理データベースから読み出したデータベースの種類が前記第1種類のデータベースである場合、前記パラメータから取り出したテナント識別子に対応するテナントの条件を前記マルチテナント管理データベースから読み出し、前記第1種類のデータベースに対して当該条件を含む第2のクエリを発行し、前記アプリケーションにより発行された第1のクエリの結果と当該第2のクエリの結果とを比較し、比較した結果に基づいて当該第1のクエリの結果の正否を処理装置により判定することを特徴とする請求項3のアクセス制御装置。
前記ユーザインタフェース接続部は、前記複数のテナントのいずれかに属するユーザから、前記パラメータとして、当該ユーザを一意に識別するユーザ識別子の入力を受け付け、当該ユーザが属するテナントのテナント識別子を前記マルチテナント管理データベースから読み出して当該ユーザ識別子に連結することにより、当該テナント識別子を前記パラメータに埋め込むことを特徴とする請求項1から4のいずれかのアクセス制御装置。
ユーザが少なくとも1人ずつ属する複数のテナントによって共用されるアプリケーションから、前記複数のテナントそれぞれの個別のデータを格納するマルチテナント対応型の少なくとも2種類のデータベースへのアクセスを制御するアクセス制御方法であって、
テナントごとに、テナントを一意に識別するテナント識別子と、アクセス対象とするデータベースの種類とを記憶装置により予め記憶するマルチテナント管理データベースを備えるコンピュータが、前記アプリケーションに入力されると前記アプリケーションが前記少なくとも2種類のデータベースへのアクセス時に出力するパラメータの入力を、前記複数のテナントのいずれかに属するユーザから入力装置により受け付け、当該ユーザが属するテナントのテナント識別子を前記マルチテナント管理データベースから読み出して当該パラメータに埋め込み、当該パラメータを前記アプリケーションに入力し、
前記コンピュータが、入力したパラメータが前記アプリケーションから出力された場合、当該パラメータに埋め込まれているテナント識別子を取り出し、取り出したテナント識別子に対応するテナントのデータベースの種類を前記マルチテナント管理データベースから読み出し、前記少なくとも2種類のデータベースのうち、読み出した種類のデータベースに格納された当該テナントの個別のデータへのアクセスを前記アプリケーションに行わせることを特徴とするアクセス制御方法。
ユーザが少なくとも1人ずつ属する複数のテナントによって共用されるアプリケーションから、前記複数のテナントそれぞれの個別のデータを格納するマルチテナント対応型の少なくとも2種類のデータベースへのアクセスを制御するプログラムであって、
テナントごとに、テナントを一意に識別するテナント識別子と、アクセス対象とするデータベースの種類とを記憶装置により予め記憶するマルチテナント管理データベースを備えるコンピュータを、
前記アプリケーションに入力されると前記アプリケーションが前記少なくとも2種類のデータベースへのアクセス時に出力するパラメータの入力を、前記複数のテナントのいずれかに属するユーザから入力装置により受け付け、当該ユーザが属するテナントのテナント識別子を前記マルチテナント管理データベースから読み出して当該パラメータに埋め込み、当該パラメータを前記アプリケーションに入力するユーザインタフェース接続部と、
前記ユーザインタフェース接続部により入力されたパラメータが前記アプリケーションから出力された場合、当該パラメータに埋め込まれているテナント識別子を取り出し、取り出したテナント識別子に対応するテナントのデータベースの種類を前記マルチテナント管理データベースから読み出し、前記少なくとも2種類のデータベースのうち、読み出した種類のデータベースに格納された当該テナントの個別のデータへのアクセスを前記アプリケーションに行わせるデータベース接続部
として機能させるためのプログラム。
【発明を実施するための形態】
【0013】
以下、本発明の実施の形態について、図を用いて説明する。
【0014】
実施の形態1.
図1は、本実施の形態に係るアクセス制御装置100の構成を示すブロック図である。
【0015】
図1において、アクセス制御装置100は、シングルテナントで利用されていた既存アプリケーション500(マルチテナント非対応型のアプリケーション)から、複数のテナントの情報を一元管理しているマルチテナント型データベース400(マルチテナント対応型のデータベース)へのアクセスを制御する。
【0016】
既存アプリケーション500は、複数のテナントによって共用されるアプリケーションの一例である。各テナントには、ユーザが少なくとも1人ずつ属するものとする。本実施の形態では、既存アプリケーション500が、テナントA、テナントB、テナントC、テナントDのユーザによって利用されるクライアントシステム101と通信を行って各種サービス(例えば、ウェブサービス)を提供する。クライアントシステム101は、テナントごとに設置される。なお、テナントの数は4つに限らず、2つでも、3つでも、5つ以上でも構わない。本実施の形態では、さらに、既存アプリケーション500が、システム管理者によって利用されるクライアントシステム102と通信を行って保守管理用のサービスを提供する。
【0017】
マルチテナント型データベース400は、複数のテナントそれぞれの個別のデータを格納する少なくとも2種類のデータベースの一例である。本実施の形態では、マルチテナント型データベース400が、表共有型データベース410とスキーマ分離型データベース420とインスタンス分離型データベース430との3種類のデータベースを組み合わせて構成されている。即ち、マルチテナント型データベース400は、マルチテナント対応のための構成が互いに異なる3種類のデータベースである。なお、マルチテナント型データベース400は、表共有型データベース410とスキーマ分離型データベース420とインスタンス分離型データベース430とのうち、2種類のデータベースのみで構成されていてもよいし、その他の種類のデータベースを含む4種類以上のデータベースで構成されていてもよい。
【0018】
アクセス制御装置100は、既存アプリケーション500をマルチテナント化するためのマルチテナントアプリケーション基盤200と、マルチテナントアプリケーション(マルチテナントアプリケーション基盤200と既存アプリケーション500との組み合わせ)を運用する上で必要な情報を管理するマルチテナント管理データベース300とを備える。
【0019】
マルチテナントアプリケーション基盤200は、UI(ユーザインタフェース)接続部210、マルチテナント制御部220、コネクション保持部230、DB(データベース)接続部240を備える。
【0020】
UI接続部210は、クライアントシステム101からサービスのリクエストを受け付け、そのクライアントシステム101が設置されたテナントのテナントIDを既存パラメータに埋め込む処理を行う。テナントIDとは、テナントを一意に識別するテナント識別子のことである。既存パラメータとは、既存アプリケーション500に入力されると既存アプリケーション500がマルチテナント型データベース400へのアクセス時に出力するパラメータのことである。
【0021】
マルチテナント制御部220は、テナントの登録・削除等のテナントの管理を行う。
【0022】
コネクション保持部230は、マルチテナントアプリケーションからマルチテナント型データベース400へのアクセス時のコネクションを管理する。
【0023】
DB接続部240は、マルチテナントアプリケーションからマルチテナント型データベース400へのアクセスを制御する。DB接続部240は、テナント分離部241、モデル切替部242、表共有型接続部243、スキーマ分離型接続部244、インスタンス分離型接続部245を有する。テナント分離部241は、既存パラメータからテナントIDを取得する。モデル切替部242は、テナントごとにアクセスするデータベースを切り替える。表共有型接続部243は、表共有型データベース410へのアクセスを実現する。スキーマ分離型接続部244は、スキーマ分離型データベース420へのアクセスを実現する。インスタンス分離型接続部245は、インスタンス分離型データベース430へのアクセスを実現する。
【0024】
マルチテナント管理データベース300は、テナント管理テーブル310、テナント情報結合設定テーブル320、データベース接続設定テーブル330を有する。テナント管理テーブル310は、マルチテナントアプリケーションを利用するテナントの情報を管理する。テナント情報結合設定テーブル320は、テナントIDを既存アプリケーション500に受け渡す際のルールを管理する。データベース接続設定テーブル330は、テナントごとのデータベースへの接続情報を管理する。
【0025】
図1には示していないが、アクセス制御装置100は、処理装置、記憶装置、入力装置、出力装置等のハードウェアを備える。ハードウェアはアクセス制御装置100の各部によって利用される。例えば、処理装置は、アクセス制御装置100の各部でデータや情報の演算、加工、読み取り、書き込み等を行うために利用される。記憶装置は、そのデータや情報を記憶するために利用される。また、入力装置は、そのデータや情報を入力するために、出力装置は、そのデータや情報を出力するために利用される。
【0026】
図2は、アクセス制御装置100のハードウェア構成の一例を示す図である。
【0027】
図2において、アクセス制御装置100は、コンピュータであり、LCD901(Liquid・Crystal・Display)、キーボード902(K/B)、マウス903、FDD904(Flexible・Disk・Drive)、CDD905(Compact・Disc・Drive)、プリンタ906といったハードウェアデバイスを備えている。これらのハードウェアデバイスはケーブルや信号線で接続されている。LCD901の代わりに、CRT(Cathode・Ray・Tube)、あるいは、その他の表示装置が用いられてもよい。マウス903の代わりに、タッチパネル、タッチパッド、トラックボール、ペンタブレット、あるいは、その他のポインティングデバイスが用いられてもよい。
【0028】
アクセス制御装置100は、プログラムを実行するCPU911(Central・Processing・Unit)を備えている。CPU911は、処理装置の一例である。CPU911は、バス912を介してROM913(Read・Only・Memory)、RAM914(Random・Access・Memory)、通信ボード915、LCD901、キーボード902、マウス903、FDD904、CDD905、プリンタ906、HDD920(Hard・Disk・Drive)と接続され、これらのハードウェアデバイスを制御する。HDD920の代わりに、フラッシュメモリ、光ディスク装置、メモリカードリーダライタ、あるいは、その他の記録媒体が用いられてもよい。
【0029】
RAM914は、揮発性メモリの一例である。ROM913、FDD904、CDD905、HDD920は、不揮発性メモリの一例である。これらは、記憶装置の一例である。通信ボード915、キーボード902、マウス903、FDD904、CDD905は、入力装置の一例である。また、通信ボード915、LCD901、プリンタ906は、出力装置の一例である。
【0030】
通信ボード915は、LAN(Local・Area・Network)等に接続されている。通信ボード915は、LANに限らず、IP−VPN(Internet・Protocol・Virtual・Private・Network)、広域LAN、ATM(Asynchronous・Transfer・Mode)ネットワークといったWAN(Wide・Area・Network)、あるいは、インターネットに接続されていても構わない。LAN、WAN、インターネットは、ネットワークの一例である。
【0031】
HDD920には、オペレーティングシステム921(OS)、ウィンドウシステム922、プログラム群923、ファイル群924が記憶されている。プログラム群923のプログラムは、CPU911、オペレーティングシステム921、ウィンドウシステム922により実行される。プログラム群923には、本実施の形態の説明において「〜部」として説明する機能を実行するプログラムが含まれている。プログラムは、CPU911により読み出され実行される。ファイル群924には、本実施の形態の説明において、「〜データ」、「〜情報」、「〜ID(識別子)」、「〜フラグ」、「〜結果」として説明するデータや情報や信号値や変数値やパラメータが、「〜ファイル」や「〜データベース」や「〜テーブル」の各項目として含まれている。「〜ファイル」や「〜データベース」や「〜テーブル」は、RAM914やHDD920等の記録媒体に記憶される。RAM914やHDD920等の記録媒体に記憶されたデータや情報や信号値や変数値やパラメータは、読み書き回路を介してCPU911によりメインメモリやキャッシュメモリに読み出され、抽出、検索、参照、比較、演算、計算、制御、出力、印刷、表示といったCPU911の処理(動作)に用いられる。抽出、検索、参照、比較、演算、計算、制御、出力、印刷、表示といったCPU911の処理中、データや情報や信号値や変数値やパラメータは、メインメモリやキャッシュメモリやバッファメモリに一時的に記憶される。
【0032】
本実施の形態の説明において用いるブロック図やフローチャートの矢印の部分は主としてデータや信号の入出力を示す。データや信号は、RAM914等のメモリ、FDD904のフレキシブルディスク(FD)、CDD905のコンパクトディスク(CD)、HDD920の磁気ディスク、光ディスク、DVD(Digital・Versatile・Disc)、あるいは、その他の記録媒体に記録される。また、データや信号は、バス912、信号線、ケーブル、あるいは、その他の伝送媒体により伝送される。
【0033】
本実施の形態の説明において「〜部」として説明するものは、「〜回路」、「〜装置」、「〜機器」であってもよく、また、「〜ステップ」、「〜工程」、「〜手順」、「〜処理」であってもよい。即ち、「〜部」として説明するものは、ROM913に記憶されたファームウェアで実現されていても構わない。あるいは、「〜部」として説明するものは、ソフトウェアのみ、あるいは、素子、デバイス、基板、配線といったハードウェアのみで実現されていても構わない。あるいは、「〜部」として説明するものは、ソフトウェアとハードウェアとの組み合わせ、あるいは、ソフトウェアとハードウェアとファームウェアとの組み合わせで実現されていても構わない。ファームウェアとソフトウェアは、プログラムとして、フレキシブルディスク、コンパクトディスク、磁気ディスク、光ディスク、DVD等の記録媒体に記憶される。プログラムはCPU911により読み出され、CPU911により実行される。即ち、プログラムは、本実施の形態の説明で述べる「〜部」としてコンピュータを機能させるものである。あるいは、プログラムは、本実施の形態の説明で述べる「〜部」の手順や方法をコンピュータに実行させるものである。
【0034】
図3は、マルチテナント管理データベース300のテナント管理テーブル310、テナント情報結合設定テーブル320、データベース接続設定テーブル330の構成例を示す図である。
【0035】
図3において、テナント管理テーブル310は、テナントID、テナント名のカラムを含む。テナント管理テーブル310は、例えば、テナントID「A」に対応付けて、テナント名「テナントA」を格納している。
【0036】
テナント情報結合設定テーブル320は、結合元パラメータ、結合先パラメータ、セパレータのカラムを含む。結合先パラメータは、UI接続部210によりテナントIDを埋め込む対象とする既存パラメータを示す。結合元パラメータ及びセパレータは、テナントIDを埋め込んだ後の既存パラメータの形式を示す。本例において、テナント情報結合設定テーブル320は、結合元パラメータ「ユーザID、テナントID」、結合先パラメータ「ユーザID」、セパレータ「−−」を格納している。ユーザIDは、ユーザを一意に識別するユーザ識別子である。例えば、テナントAのユーザがユーザID「USER01」を既存アプリケーション500に入力しようとすると、ユーザIDがUI接続部210により「A−−USER01」に変換されてから既存アプリケーション500に入力されることになる。なお、結合先パラメータとしては、ユーザIDに限らず、ユーザ名、サービスの受付番号、後述する組織ID等、別の既存パラメータを用いても構わない。結合元パラメータ、セパレータについても、上記したものは一例であって、種々の変更が可能である。
【0037】
データベース接続設定テーブル330は、テナントID、接続先DBモデル、プールID、DBチェック情報のカラムを含む。接続先DBモデルは、テナントのアクセス対象として決められたデータベースの種類を示す。プールIDは、データベースのコネクションプール(データベースとの接続)を一意に識別する接続識別子を示す。接続先DBモデルが表共有型データベース410の場合、コネクションプールは各テナントに共通のものが割り当てられる。接続先DBモデルがスキーマ分離型データベース420又はインスタンス分離型データベース430の場合、コネクションプールは各テナントに個別のものが割り当てられる。DBチェック情報は、特定のテーブルに格納されるデータについて設定された条件を示す。この条件は、接続先DBモデルが表共有型データベース410の場合のみ設定される。なお、DBチェック情報は、本実施の形態では使用しないものとする。データベース接続設定テーブル330は、例えば、テナントID「A」に対応付けて、接続先DBモデル「表共有型」(表共有型データベース410を示す)、プールID「poolCommon」(共通のコネクションプールを示す)を格納している。
【0038】
上記のように、本実施の形態において、マルチテナント管理データベース300は、テナントごとに、少なくともテナントIDとデータベースの種類(接続先DBモデルやプールIDによって示される)とを記憶装置により予め記憶する。
【0039】
図4は、表共有型データベース410の構成例を示す図である。
【0040】
図4において、表共有型データベース410は、複数のテナントそれぞれの個別のデータを、テナントIDのカラムを含む共通のテーブルに格納することによりマルチテナント対応を行う第1種類のデータベースの一例である。表共有型データベース410は、各テナントに共通のテーブルとして、個人情報テーブル(ユーザ一覧)、組織情報テーブル(組織一覧)、配属情報テーブル(配属一覧)、認証情報テーブル(パスワード一覧)を有する。
【0041】
個人情報テーブル(ユーザ一覧)は、テナントID、ユーザID、ユーザ名のカラムを含む。本例では、ユーザIDが(シングルテナントアプリケーションのように)全テナント間でユーザを一意に識別するものとするが、ユーザが属するテナント内のみでユーザを一意に識別できればよい。個人情報テーブル(ユーザ一覧)は、例えば、テナントID「A」に対応付けて、ユーザID「USER01」、ユーザ名「ユーザ1」を格納している。
【0042】
組織情報テーブル(組織一覧)は、テナントID、組織ID、組織名のカラムを含む。組織IDは、テナントの組織(部署等)を一意に識別する組織識別子である。組織情報テーブル(組織一覧)は、例えば、テナントID「A」に対応付けて、組織ID「ORG1」、組織名「組織1」を格納している。
【0043】
配属情報テーブル(配属一覧)は、テナントID、配属ID、ユーザID、組織IDのカラムを含む。配属IDは、ユーザと組織との対応付け(即ち、配属)を一意に識別する配属識別子である。配属情報テーブル(配属一覧)は、例えば、テナントID「A」に対応付けて、配属ID「1」、ユーザID「USER01」、組織ID「ORG1」を格納している。
【0044】
認証情報テーブル(パスワード一覧)は、テナントID、ユーザID、パスワードのカラムを含む。認証情報テーブル(パスワード一覧)は、例えば、テナントID「A」に対応付けて、ユーザID「USER01」、パスワード「xxxxxxxx」を格納している。
【0045】
図5は、スキーマ分離型データベース420の構成例を示す図である。
【0046】
図5において、スキーマ分離型データベース420は、テナントごとに、テナントの個別のデータを個別のテーブルに格納することによりマルチテナント対応を行う第2種類のデータベースの一例である。スキーマ分離型データベース420は、各テナントの個別のテーブルとして、個人情報テーブル(テナントA_ユーザ一覧、テナントB_ユーザ一覧)、組織情報テーブル(テナントA_組織一覧、テナントB_組織一覧)、配属情報テーブル(テナントA_配属一覧、テナントB_配属一覧)を有する。図示していないが、スキーマ分離型データベース420は、認証情報テーブル(テナントA_パスワード一覧、テナントB_パスワード一覧)も有する。
【0047】
個人情報テーブル(テナントA_ユーザ一覧、テナントB_ユーザ一覧)、組織情報テーブル(テナントA_組織一覧、テナントB_組織一覧)、配属情報テーブル(テナントA_配属一覧、テナントB_配属一覧)、認証情報テーブル(テナントA_パスワード一覧、テナントB_パスワード一覧)の各テーブルは、テナントIDのカラムを含む代わりに、テーブル名にテナント名(テナントIDでもよい)を含んでいる。各テーブルに含まれるカラムについては、
図4に示した表共有型データベース410のものと同様である。
【0048】
図6は、インスタンス分離型データベース430の構成例を示す図である。
【0049】
図6において、インスタンス分離型データベース430は、テナントごとに、テナントの個別のデータを格納する個別のデータベースインスタンスが存在することによりマルチテナント対応を行う第3種類のデータベースの一例である。インスタンス分離型データベース430のテナントA用インスタンス及びテナントB用インスタンスは、それぞれ個人情報テーブル(ユーザ一覧)、組織情報テーブル(組織一覧)、配属情報テーブル(配属一覧)を有する。図示していないが、テナントA用インスタンス及びテナントB用インスタンスは、それぞれ認証情報テーブル(パスワード一覧)も有する。
【0050】
個人情報テーブル(ユーザ一覧)、組織情報テーブル(組織一覧)、配属情報テーブル(配属一覧)、認証情報テーブル(パスワード一覧)の各テーブルは、テナントIDのカラムを含んだり、テーブル名にテナント名を含んだりする代わりに、テナントごとにデータベースインスタンスが分かれている。各テーブルに含まれるカラムについては、
図4に示した表共有型データベース410のものと同様である。
【0051】
以下では、
図7〜
図9を用いて、テナントAのクライアントシステム101からサービスのリクエストが送信されたときのアクセス制御装置100の動作(本実施の形態に係るアクセス制御方法、本実施の形態に係るプログラムの処理手順)について説明する。
【0052】
図7は、既存アプリケーション500にテナントIDを意識させずに既存アプリケーション500を利用するために、既存パラメータに対するテナントIDの結合及び分離を行う流れを示すシーケンス図である。
【0053】
S101において、テナントAのクライアントシステム101は、UI接続部210に対し、ログイン要求を出す。このとき、クライアントシステム101は、UI接続部210に対し、テナントID、ユーザID、パスワードを送信するものとする。UI接続部210は、テナントID、ユーザID、パスワードを入力装置により受信する。
【0054】
S102において、UI接続部210は、受信したテナントIDが正しいものか、及び、テナントIDをどのように既存パラメータに埋め込むのか(結合ルール)に関する情報を入手するために、マルチテナント制御部220にテナントID確認通知とテナント情報結合情報取得要求を出す。
【0055】
S103において、マルチテナント制御部220は、マルチテナント管理データベース300に対し、テナント管理テーブル310にUI接続部210から受け取ったテナントIDが含まれているかどうか問い合わせる。また、テナント情報結合設定テーブル320の結合ルールを問い合わせる。
【0056】
S104において、マルチテナント管理データベース300は、マルチテナント制御部220の問い合わせに対し、テナント管理テーブル310、テナント情報結合設定テーブル320を検索し、結果を返す。
【0057】
S105において、マルチテナント制御部220は、UI接続部210に対し、検索結果を返す。
【0058】
S106において、UI接続部210は、マルチテナント制御部220経由で取得した結合ルールを基に、既存パラメータに対し、テナントIDを処理装置により埋め込む。本例では、
図3に示したように、結合ルールとして、結合元パラメータ「ユーザID、テナントID」、結合先パラメータ「ユーザID」、セパレータ「−−」が設定されているものとする。そのため、テナントIDが「A」、ユーザIDが「USER01」のユーザの場合、既存パラメータのユーザIDは「A−−USER01」となる。テナントIDを埋め込んだ後に、UI接続部210は、既存アプリケーション500に対し、ユーザIDを「A−−USER01」とした上でリクエストを送信する。
【0059】
S107において、既存アプリケーション500は、シングルテナントの場合と同様の処理を実施する。具体的には、既存アプリケーション500は、マルチテナント型データベース400に対するクエリ(第1のクエリ)を発行する。
【0060】
S108において、既存アプリケーション500は、DB接続部240のテナント分離部241に対してデータベース接続要求を出す。データベース接続要求には、パラメータとしてユーザIDが含まれている。
【0061】
S109において、テナント分離部241は、既存アプリケーション500から受け取ったデータベース接続要求のパラメータからテナントIDを抽出するための情報を取得するために、マルチテナント制御部220に対し、テナント情報結合情報取得要求を出す。
【0062】
S110において、マルチテナント制御部220は、テナント分離部241から受け取ったテナント情報結合情報取得要求を基に、マルチテナント管理データベース300に対して、結合ルールを問い合わせる。
【0063】
S111において、マルチテナント管理データベース300は、マルチテナント制御部220の問い合わせに対し、テナント情報結合設定テーブル320を検索し、結果を返す。
【0064】
S112において、マルチテナント制御部220は、テナント分離部241に対し、検索結果を返す。
【0065】
S113において、テナント分離部241は、結合ルールを基に、既存パラメータからテナントIDを処理装置により取得する。本例では、ユーザIDからテナントIDを取得する。
【0066】
S114において、テナント分離部241は、DB接続部240のモデル切替部242に対し、既存アプリケーション500から受け取ったデータベース接続要求を、テナントIDを付与した状態で渡す。モデル切替部242は、データベース接続要求を受け取る。
【0067】
上記のように、本実施の形態において、UI接続部210は、既存パラメータの入力を、複数のテナントのいずれかに属するユーザから入力装置により受け付ける。UI接続部210は、当該ユーザが属するテナントのテナントIDをマルチテナント管理データベース300から読み出して、当該ユーザから入力された既存パラメータに処理装置により埋め込む。そして、UI接続部210は、テナントIDを埋め込んだ既存パラメータを既存アプリケーション500に入力する。本例において、UI接続部210は、当該ユーザから、既存パラメータとして、当該ユーザのユーザIDの入力を受け付け、当該ユーザが属するテナントのテナントIDを、当該ユーザから入力されたユーザIDに連結することにより、テナントIDを既存パラメータに埋め込む。
【0068】
また、本実施の形態において、DB接続部240は、UI接続部210により入力された既存パラメータが既存アプリケーション500から出力された場合、出力された既存パラメータに埋め込まれているテナントIDを処理装置により取り出す。
【0069】
図8は、表共有型データベース410へのアクセスの流れを示すシーケンス図である。
【0070】
S201において、モデル切替部242は、受け取ったデータベース接続要求からテナントIDを取得し、どのようにデータベースへアクセスするのかに関する情報を取得するため、取得したテナントIDをマルチテナント制御部220に通知する。
【0071】
S202において、マルチテナント制御部220は、通知されたテナントIDのテナントがどのようにデータベースにアクセスするのかをマルチテナント管理データベース300に対して問い合わせる。
【0072】
S203において、マルチテナント管理データベース300は、マルチテナント制御部220の問い合わせに対し、データベース接続設定テーブル330を検索し、結果を返す。この結果には、プールIDが含まれている。
【0073】
S204において、マルチテナント制御部220は、マルチテナント管理データベース300より取得したプールIDを基に、コネクション保持部230に対し、コネクションプールの取得を要求する。このとき、マルチテナント制御部220は、コネクション保持部230に対し、プールIDを送信するものとする。
【0074】
S205において、コネクション保持部230は、受け取ったプールIDのコネクションプールを返す。
【0075】
S206において、マルチテナント制御部220は、モデル切替部242より受け取ったテナントIDのテナントが使用するデータベースのコネクションプールをモデル切替部242に返す。
【0076】
S207において、モデル切替部242は、マルチテナント制御部220から受け取ったコネクションプール(接続先情報)を基に、接続先を切り替える。本例では、
図3に示したように、テナントAの接続先DBモデルとして、表共有型データベース410が設定されているものとする。そのため、モデル切替部242は、表共有型接続部243に接続する。
【0077】
S208において、表共有型接続部243は、コネクション保持部230より取得したコネクションプールを用いてマルチテナント型データベース400の表共有型データベース410に接続し、検索要求を出す。具体的には、表共有型接続部243は、既存アプリケーション500により発行されたクエリ(例えば、SQLのSELECT文)に、アクセス対象となるテーブルのテナントIDとモデル切替部242が取得したテナントIDとが一致することを条件(例えば、WHERE句)として追加した上で、そのクエリを表共有型データベース410に対して発行する。
【0078】
S209において、表共有型データベース410は、検索結果(具体的には、クエリの結果)を表共有型接続部243へ返す。
【0079】
S210において、表共有型接続部243は、表共有型データベース410から返ってきた検索結果をモデル切替部242へ返す。モデル切替部242は、検索結果を受信する。
【0080】
上記のように、本実施の形態において、DB接続部240は、既存アプリケーション500から出力された既存パラメータに埋め込まれているテナントIDを取り出した後、取り出したテナントIDに対応するテナントのデータベースの種類をマルチテナント管理データベース300から読み出す。そして、DB接続部240は、マルチテナント型データベース400を構成する3種類のデータベースのうち、読み出した種類のデータベースに格納された当該テナントの個別のデータへのアクセスを既存アプリケーション500に行わせる。
【0081】
図9は、マルチテナント型データベース400の検索結果をクライアントシステム101へ返す処理の流れを示すシーケンス図である。
【0082】
S301において、モデル切替部242は、受信したマルチテナント型データベース400の検索結果をテナント分離部241へ渡す。
【0083】
S302において、テナント分離部241は、既存アプリケーション500へモデル切替部242から取得したマルチテナント型データベース400の検索結果を渡す。
【0084】
S303において、既存アプリケーション500は、受け取ったマルチテナント型データベース400の検索結果を基に、シングルテナントの場合と同様の処理を実施する。具体的には、既存アプリケーション500は、マルチテナント型データベース400に対するクエリの結果に基づいて、所定の処理(例えば、ウェブサービスのための処理)を実行する。
【0085】
S304において、既存アプリケーション500は、処理の実施結果をUI接続部210に返す。
【0086】
S305において、UI接続部210は、処理の実施結果をテナントAのクライアントシステム101に返す。
【0087】
以上説明した動作により、マルチテナントアプリケーションからテナントAのユーザへのサービス提供が行われる。テナントBのクライアントシステム101からサービスのリクエストが送信されたときにも、同様の動作により、マルチテナントアプリケーションからテナントBのユーザへのサービス提供が行われる。
【0088】
以下では、
図10を用いて、テナントCのクライアントシステム101からサービスのリクエストが送信されたときのアクセス制御装置100の動作(本実施の形態に係るアクセス制御方法、本実施の形態に係るプログラムの処理手順)について説明する。
【0089】
既存アプリケーション500にテナントIDを意識させずに既存アプリケーション500を利用するために、既存パラメータに対するテナントIDの結合及び分離を行う流れは、
図7に示したものと同様である。
【0090】
図10は、スキーマ分離型データベース420へのアクセスの流れを示すシーケンス図である。
【0091】
S401〜S406の処理については、
図8に示したS201〜S206の処理と同様である。
【0092】
S407において、モデル切替部242は、マルチテナント制御部220から受け取ったコネクションプール(接続先情報)を基に、接続先を切り替える。本例では、
図3に示したように、テナントCの接続先DBモデルとして、スキーマ分離型データベース420が設定されているものとする。そのため、モデル切替部242は、スキーマ分離型接続部244に接続する。
【0093】
S408において、スキーマ分離型接続部244は、コネクション保持部230より取得したコネクションプールを用いてマルチテナント型データベース400のスキーマ分離型データベース420に接続し、検索要求を出す。具体的には、スキーマ分離型接続部244は、既存アプリケーション500により発行されたクエリ(例えば、SQLのSELECT文)でアクセス対象として指定されたテーブルのテーブル名に、モデル切替部242が取得したテナントIDに対応するテナント名(テナントIDそのものでもよい)を所定の形式で追加(連結)した上で、そのクエリをスキーマ分離型データベース420に対して発行する。
【0094】
S209において、スキーマ分離型データベース420は、検索結果(具体的には、クエリの結果)をスキーマ分離型接続部244へ返す。
【0095】
S210において、スキーマ分離型接続部244は、スキーマ分離型データベース420から返ってきた検索結果をモデル切替部242へ返す。モデル切替部242は、検索結果を受信する。
【0096】
マルチテナント型データベース400の検索結果をクライアントシステム101へ返す処理の流れは、
図9に示したものと同様である。
【0097】
以下では、
図11を用いて、テナントDのクライアントシステム101からサービスのリクエストが送信されたときのアクセス制御装置100の動作(本実施の形態に係るアクセス制御方法、本実施の形態に係るプログラムの処理手順)について説明する。
【0098】
既存アプリケーション500にテナントIDを意識させずに既存アプリケーション500を利用するために、既存パラメータに対するテナントIDの結合及び分離を行う流れは、
図7に示したものと同様である。
【0099】
図11は、インスタンス分離型データベース430へのアクセスの流れを示すシーケンス図である。
【0100】
S501〜S506の処理については、
図8に示したS201〜S206の処理と同様である。
【0101】
S507において、モデル切替部242は、マルチテナント制御部220から受け取ったコネクションプール(接続先情報)を基に、接続先を切り替える。本例では、
図3に示したように、テナントDの接続先DBモデルとして、インスタンス分離型データベース430が設定されているものとする。そのため、モデル切替部242は、インスタンス分離型接続部245に接続する。
【0102】
S508において、インスタンス分離型接続部245は、コネクション保持部230より取得したコネクションプールを用いてマルチテナント型データベース400のインスタンス分離型データベース430に接続し、検索要求を出す。具体的には、インスタンス分離型接続部245は、既存アプリケーション500により発行されたクエリ(例えば、SQLのSELECT文)を、インスタンス分離型データベース430のテナントA用インスタンスに対して発行する。
【0103】
S509において、インスタンス分離型データベース430は、検索結果(具体的には、クエリの結果)をインスタンス分離型接続部245へ返す。
【0104】
S510において、インスタンス分離型接続部245は、インスタンス分離型データベース430から返ってきた検索結果をモデル切替部242へ返す。モデル切替部242は、検索結果を受信する。
【0105】
マルチテナント型データベース400の検索結果をクライアントシステム101へ返す処理の流れは、
図9に示したものと同様である。
【0106】
以上説明したように、本実施の形態では、既存アプリケーション500を可能な限り流用した状態でマルチテナント化するために、既存アプリケーション500の前後のインタフェース部分でテナントID(テナントごとに一意に割り振られる識別子)の埋め込み/取り出しを行う。
【0107】
マルチテナント対応でない既存アプリケーション500ではテナントIDを扱うことができない。そこで、既存アプリケーション500で利用しているパラメータ(例えば、ユーザID)にテナントIDを結合する。例えば、結合元パラメータ「ユーザID、テナントID」、結合先パラメータ「ユーザID」、セパレータ「−−」のように設定された結合ルールでテナントIDが「A」、ユーザIDが「USER01」のユーザの場合、既存パラメータのユーザIDは「A−−USER01」となる。このとき結合ルールを固定とするのではなく、柔軟に設定可能とすることで、例えば既存アプリケーション500のユーザIDの文字数に制限がある場合は、ユーザ名のパラメータを結合先にするといったことが可能となる。また、マルチテナント化する既存アプリケーション500が複数あり、既存アプリケーション500の利用しているパラメータが異なる場合でも、既存アプリケーション500ごとにルールを設定することで対応可能となる。
【0108】
本実施の形態に係るアクセス制御装置100は、マルチテナントアプリケーションを実現するためのソフトウェア及びそれを格納・実行するハードウェアからなり、UI接続部210、DB接続部240、テナント情報結合設定テーブル320を備える。UI接続部210は、ユーザの所属するテナントのテナントIDを、テナント情報結合設定を基に、既存アプリケーション500で使用されているパラメータに埋め込む。DB接続部240は、データベースのアクセスに必要なテナントIDを、テナント情報結合設定を基に、パラメータから取り出す。テナント情報結合設定テーブル320は、テナント情報結合設定として、テナントIDを埋め込むパラメータや、埋め込むための条件を管理する。
【0109】
従来技術では、既存アプリケーション500を用いてデータベースからデータを読み出す場合、セッション情報からテナントID等を取得していたため、既存アプリケーション500を通したデータとテナントIDとの対応付けがうまくいかない可能性がある。既存アプリケーション500とデータベースとの間でセッションIDを取得できないと、テナントIDを取得することはできない。これに対し、本実施の形態では、UI接続部210からDB接続部240にセッション情報(セッションID)を渡していない状態であっても、既存アプリケーション500がテナントIDを意識する必要なく、DB接続部240にてテナントIDを取得することが可能である。
【0110】
また、本実施の形態では、データベースのモデルとして、表共有型、スキーマ分離型、インスタンス分離型が混在しているマルチテナント型データベース400を利用する。
【0111】
複数テナントの情報を持つデータベースのモデルは、データベースの表の構成やインスタンスの構成によって、表共有型、スキーマ分離型、インスタンス分離型に分けられる。既存アプリケーション500をマルチテナント化するにあたって、複数テナントのそれぞれが利用しているデータベースの形式はテナントによって異なる可能性が高く、対応可能なモデルが1つの場合は、データベースを移行する手間がかかってしまう。また、「集約度を上げたい」、「独自のスキーマを使いたい」といった利用者の様々なニーズに合わせてモデルを切り替えるような方式を実現できない。これに対し、本実施の形態では、データベース接続設定テーブル330でテナントごとに利用するデータベースのモデルが何かを管理し、マルチテナント型データベース400へ接続する際にモデルを切り替える。モデルの切替時には、予めテナントごとに利用可能なデータベースへのコネクションを保持するコネクションプールを用意し、マルチテナント型データベース400への接続時にはテナントに割り当てられたコネクションを選択することで、モデルの切替が可能となる。
【0112】
実施の形態2.
本実施の形態について、主に実施の形態1との差異を説明する。
【0113】
本実施の形態に係るアクセス制御装置100の構成は、
図1に示した実施の形態1のものと同様である。
【0114】
以下では、
図12を用いて、マルチテナントアプリケーションを利用するテナントを追加する際のアクセス制御装置100の動作(本実施の形態に係るアクセス制御方法、本実施の形態に係るプログラムの処理手順)について説明する。
【0115】
図12は、システム管理者のクライアントシステム102から新規にテナントを追加する処理の流れを示すシーケンス図である。
【0116】
S601において、システム管理者のクライアントシステム102は、マルチテナント制御部220に対し、テナントの登録要求を出す。このとき、テナント名及びテナントの利用するデータベースのモデルについてマルチテナント制御部220に通知する。
【0117】
S602において、マルチテナント制御部220は、マルチテナント管理データベース300に対し、テナント管理テーブル310にテナント名を登録し、テナントIDを発行するよう要求する。
【0118】
S603において、マルチテナント管理データベース300は、テナントを登録し、発行したテナントIDを返す。
【0119】
S604において、マルチテナント制御部220は、コネクション保持部230に対し、追加したテナント用のコネクションプールを発行するように要求する。
【0120】
S605において、コネクション保持部230は、新規テナント用のコネクションプールを生成し、プールIDを返す。ただし、テナントの利用するデータベースのモデルが表共有型データベース410だった場合、コネクション保持部230は、新規コネクションプールを生成せず、表共有型データベース410の共通のコネクションプールに対応するプールIDを返す。
【0121】
S606において、マルチテナント制御部220は、マルチテナント管理データベース300に対し、データベース接続設定テーブル330に新規テナントのテナントID、接続先DBモデル、プールIDを追加する更新を要求する。
【0122】
S607において、マルチテナント管理データベース300は、データベース接続設定テーブル330の更新を行い、結果を返す。
【0123】
S608において、マルチテナント制御部220は、マルチテナント型データベース400に対し、新規テナント用のデータ領域を追加するよう要求する。
【0124】
S609において、マルチテナント型データベース400は、新規テナントのデータ領域を追加し、成否をマルチテナント制御部220に通知する。
【0125】
S610において、マルチテナント制御部220は、システム管理者のクライアントシステム102に対し、登録の成否を通知する。
【0126】
以上の動作により、マルチテナントアプリケーションを利用したいという新規テナントに対して、即時でアプリケーションの利用を開放することが可能となる。
【0127】
以上説明したように、本実施の形態では、マルチテナントサービスを提供する上で、マルチテナントアプリケーションを利用していなかったテナントが利用を希望する場合に、既存アプリケーション500の改修なく、テナントの追加が可能である。そのために、本実施の形態では、マルチテナントアプリケーションのシステム管理者が管理用アプリケーションでテナントを登録した場合、マルチテナント制御部220によって新規テナントが利用するのに必要な設定を自動で行う。具体的には、マルチテナント型データベース400に新規テナント用のデータ領域を確保し、データベースアクセス用のコネクションの設定を用意する。
【0128】
実施の形態3.
本実施の形態について、主に実施の形態1との差異を説明する。
【0129】
図13は、本実施の形態に係るアクセス制御装置100の構成を示すブロック図である。
【0130】
図13において、アクセス制御装置100は、DB接続部240の表共有型接続部243に、表共有型データベース410から受信した結果の整合性を確認するためのデータチェック部246を備える。その他の構成は、
図1に示した実施の形態1のものと同様である。
【0131】
図14は、マルチテナント管理データベース300のデータベース接続設定テーブル330の構成例を示す図である。
【0132】
図14において、データベース接続設定テーブル330は、
図3に示した実施の形態1のものと同様に、テナントID、接続先DBモデル、プールID、DBチェック情報のカラムを含む。DBチェック情報は、前述したように、特定のテーブルに格納されるデータについて設定された条件を示す。この条件は、接続先DBモデルが表共有型データベース410の場合のみ設定される。本例において、データベース接続設定テーブル330は、テナントID「A」に対応付けて、テナントAのデータについてのチェック条件をDBチェック情報として格納している。また、データベース接続設定テーブル330は、テナントID「B」に対応付けて、テナントBのデータについてのチェック条件をDBチェック情報として格納している。
【0133】
上記のように、本実施の形態において、マルチテナント管理データベース300は、表共有型データベース410をアクセス対象とするテナントごとに、各テナントに共通のテーブルに格納されるデータについて設定された条件を記憶装置により予め記憶する。
【0134】
以下では、
図15を用いて、テナントAのクライアントシステム101からサービスのリクエストが送信されたときのアクセス制御装置100の動作(本実施の形態に係るアクセス制御方法、本実施の形態に係るプログラムの処理手順)について説明する。
【0135】
既存アプリケーション500にテナントIDを意識させずに既存アプリケーション500を利用するために、既存パラメータに対するテナントIDの結合及び分離を行う流れは、
図7に示した実施の形態1のものと同様である。
【0136】
図15は、表共有型データベース410へのアクセスの流れを示すシーケンス図である。
【0137】
S701〜S709の処理については、
図8に示したS201〜S209の処理と同様である。
【0138】
S710において、表共有型接続部243は、表共有型データベース410からの検索結果に対し、データチェック部246を用いて他のテナントの情報が混ざっていないかどうか確認する。
【0139】
S711において、データチェック部246は、データベース接続設定テーブル330のDBチェック情報を基に、表共有型データベース410からの検索結果に対し、他のテナントの情報がないかどうかを処理装置により確認する。データチェック部246は、他のテナントの情報が混ざっていることを検知した場合、その情報を削除するか、あるいは、エラーを通知する。
【0140】
S712の処理については、
図8に示したS210の処理と同様である。なお、S711でデータチェック部246がエラーを通知した場合は、検索結果としてエラーをモデル切替部242へ通知する。
【0141】
マルチテナント型データベース400の検索結果をクライアントシステム101へ返す処理の流れは、
図9に示したものと同様である。
【0142】
以上説明した動作により、マルチテナントアプリケーションからテナントAのユーザへのサービス提供が行われる。テナントBのクライアントシステム101からサービスのリクエストが送信されたときにも、同様の動作により、マルチテナントアプリケーションからテナントBのユーザへのサービス提供が行われる。
【0143】
図16は、S711におけるデータチェック部246の動作例を示す図である。
【0144】
図16において、データチェック部246は、既存パラメータから取り出されたテナントIDに対応するDBチェック情報により設定された条件を含むクエリ(第2のクエリ)を表共有型データベース410に対して発行する。データチェック部246は、発行したクエリ(第2のクエリ)の結果と、S708で表共有型接続部243を介して既存アプリケーション500により発行されたクエリ(第1のクエリ)の結果とを比較する。そして、データチェック部246は、比較の結果に基づいて、S708で表共有型接続部243を介して既存アプリケーション500により発行されたクエリ(第1のクエリ)の結果の正否を処理装置により判定する。
【0145】
ここで、第1例として、データベース接続設定テーブル330において、テナントAのDBチェック情報により、クエリのアクセス対象とするテーブル全てのテナントIDが「A」であることがチェック条件として設定されているとする。そして、既存アプリケーション500が、個人情報テーブル(ユーザ一覧)、組織情報テーブル(組織一覧)、配属情報テーブル(配属一覧)をアクセス対象として指定して、テナントID、ユーザ名、組織名を抽出する第1クエリを発行したとする。この場合、S708において、表共有型接続部243は、既存アプリケーション500により発行された第1クエリ(例えば、SQLのSELECT文)に、個人情報テーブル(ユーザ一覧)、組織情報テーブル(組織一覧)、配属情報テーブル(配属一覧)のテナントIDが「A」であることを条件(例えば、WHERE句)として追加した上で、その第1クエリを表共有型データベース410に対して発行する。S711において、データチェック部246は、データベース接続設定テーブル330のDBチェック情報に基づき、個人情報テーブル(ユーザ一覧)、組織情報テーブル(組織一覧)、配属情報テーブル(配属一覧)のテナントIDが「A」であることを条件として含み、第1クエリと同様に、個人情報テーブル(ユーザ一覧)、組織情報テーブル(組織一覧)、配属情報テーブル(配属一覧)をアクセス対象として指定して、テナントID、ユーザ名、組織名を抽出する第2のクエリを表共有型データベース410に対して発行する(この第1例では、第2クエリは、表共有型接続部243により発行される第1クエリと同一のクエリとなる)。データチェック部246は、第2のクエリの結果と第1のクエリの結果とを比較する。第2のクエリの結果と第1のクエリの結果とは一致するため、データチェック部246は、第1のクエリの結果が正しいと判定する。
【0146】
また、第2例として、データベース接続設定テーブル330において、テナントAのDBチェック情報により、ユーザIDが「USER01」又は「USER02」であることがチェック条件として設定されているとする。そして、既存アプリケーション500が、上記第1例と同じ第1クエリを発行したとする。この場合、S708において、表共有型接続部243は、既存アプリケーション500により発行された第1クエリ(例えば、SQLのSELECT文)に、上記第1例と同じ条件を追加した上で、その第1クエリを表共有型データベース410に対して発行する。S711において、データチェック部246は、データベース接続設定テーブル330のDBチェック情報に基づき、個人情報テーブル(ユーザ一覧)、配属情報テーブル(配属一覧)のユーザIDが「USER01」又は「USER02」であることを条件として含み、第1クエリと同様に、個人情報テーブル(ユーザ一覧)、組織情報テーブル(組織一覧)、配属情報テーブル(配属一覧)をアクセス対象として指定して、テナントID、ユーザ名、組織名を抽出する第2のクエリを表共有型データベース410に対して発行する。データチェック部246は、第2のクエリの結果と第1のクエリの結果とを比較する。第2のクエリの結果と第1のクエリの結果とは一致するため、データチェック部246は、第1のクエリの結果が正しいと判定する。
【0147】
以上説明したように、本実施の形態では、表共有型データベース410へアクセスする際に検索結果に他のテナントの情報が混ざることなく、対象のテナントの情報のみを確実に取得するためのチェック機能を実現する。
【0148】
マルチテナントアプリケーションのデータベースが表共有型モデルの場合、データベースのテーブル上では複数のテナントの情報が混在しているため、検索のSQLでWHERE句により別のテナントが混ざらないようにする必要がある。しかしながら、検索のSQLが複雑になってくる場合、単純にWHERE句にテナント条件を追加するだけではテナントの情報を分離しきれないケースも考えられる。例えば、検索の際に複数のテーブルをJOIN句により結合したSQLを用いる場合、他のテナントの情報が紛れ込んでしまう可能性がある。これに対し、本実施の形態では、データベースの検索結果に対し、テナントごとの条件をWHERE句に記述したSQLで再度検索をかけることにより、別のテナントの情報が含まれるのを防ぐことが可能になる。
【0149】
以上、本発明の実施の形態について説明したが、これらの実施の形態のうち、2つ以上を組み合わせて実施しても構わない。あるいは、これらの実施の形態のうち、1つを部分的に実施しても構わない。あるいは、これらの実施の形態のうち、2つ以上を部分的に組み合わせて実施しても構わない。なお、本発明は、これらの実施の形態に限定されるものではなく、必要に応じて種々の変更が可能である。