DBFlute: 複数スキーマ(additionalSchemaList)

地味だけど派手な機能です。

例えば、
Oracleインスタンスが一つあって、
そのインスタンスの中にスキーマ「A」とスキーマ「B」あって、
一つのアプリケーションからスキーマ「A」とスキーマ「B」を
ユーザ「A」からアクセスする
(ユーザ「A」にスキーマ「B」へのアクセス権を付与)
という場合

今まで、DBFluteでは1スキーマDBFluteだったため、
このような状況の場合は、
 o SYNONYMやVIEW経由で参照
 o 二つのDBFluteクライアントを作る
   ※複数DB(マルチDB)の時の対応と同じ
のような対応をする必要がありました。

0.8.1からは、これにもう一つ選択肢が追加されます。
「A」のDBFluteクライアントだけ作成して、
databaseInfoMap.dfpropに以下のように設定をします。
map:{
    ; driver        = oracle.jdbc.OracleDriver
    ; url           = jdbc:oracle:thin:@localhost:1521:XE
    ; schema        = EXAMPLEDB
    ; user          = exampledb
    ; password      = exampledb
    ; variousMap    = map:{
        ; additionalSchemaList=list:{B}
    }
}
追記(2010/04/24):
後のバージョンで、細かく設定できる
additionalSchemaMapに変わりました。

このように設定すると、JDBCタスクでスキーマ「B」の
テーブルも取得します。そして、Generateされた「B」の
クラスでDBアクセスするときは、SQL上のテーブル名が
「スキーマ名.テーブル名」になります(外だしSQLは除外)。
無論、ユーザ「A」に権限を付与する必要があります。

この方法が適用できるかどうかはDB周りのインフラ設計次第なので、
この方法だけあれば良いというわけではありませんし、
また、適用できてもこの方法が良いかどうかはプロジェクト要件次第なので、
(「B」への参照が限定的な検索だけとかであれば VIEWとかでもいいし)
一つの解決策ということでお考え下さい。

dbflute-oracle-exampleにて実践しております。
なので、すいません、今までOracle環境作ってこのExampleを
利用していた方は、今のままだと落ちるテストがあります。
別途「nextexampledb」という名前のスキーマを作って、
テーブルを作ってあげる必要があります。
こちら詳細はdbflute-oracle-example/readme.txtに書いてあります。