この章では、Microsoft AccessとOracleの両方のアーキテクチャの概要を示して、移行プロセスの概要を説明します。内容は次のとおりです。
Microsoft Accessでは、Microsoft Jetデータベース・エンジンというファイル・サーバーDBMSテクノロジをベースとしています。Microsoft Accessのフォーム、レポートおよびBasicコードは、Microsoft Jetデータベース・エンジンに依存し、固有の.mdbファイル形式で格納されたデータを管理します。図2-1に、Microsoft Accessのアーキテクチャを示します。
シングル・ユーザーのMicrosoft Accessアプリケーションでは、.mdbファイルとMicrosoft Accessは同一システムに配置されます。複数ユーザーのMicrosoft Accessアプリケーションでは、.mdbファイルはファイル・サーバーに配置され、共有されます。各クライアントは、Microsoft AccessおよびMicrosoft Jetデータベース・エンジンのコピーを実行します。この構成では、Microsoft Jetデータベース・エンジンが、問合せの処理を完了するためにネットワーク上で大量のデータ(表全体など)を移動する必要があります。
Data Access Object(DAO)DLLでは、Microsoft Access BasicおよびVisual Basicへのクラスの階層が提供されています。DAOは、Microsoft Jetデータベース・エンジンのデータベース、作業領域、問合せ定義、パラメータ、レコードセット、表、フィールド、索引、リレーションシップ、ユーザーおよびグループの定義と公開を行います。
Microsoft Jetデータベース・エンジンは、外部データソースへのリンクを管理します。dBase、ParadoxおよびBtrieveへのリンクは、内部Jet ISAMドライバ・インタフェースを介して行われます。これらのDLLは、Microsoft Accessとともに提供されます。また、Microsoft Jetデータベース・エンジンではODBCへのリンクがサポートされているため、広範囲のDBMSサーバーへのアクセスが可能になります。
Microsoft Jetデータベース・エンジンが問合せを処理すると、レコードの結果セットに対してレコードセット(カーソル)を戻します。Microsoft Jetデータベース・エンジンでは、スナップショット・タイプとダイナセット・タイプのレコードセットがサポートされています。
スナップショットは、問合せの実行時に存在していたデータの静止イメージです。スナップショットを戻すと、Microsoft Jetデータベース・エンジンは問合せを完了し、すべての結果行および列を仮想表に抽出し、この仮想表をユーザーに表示します。スナップショットのユーザーは、スナップショットの問合せやスナップショットに基づいたフォームおよびレポートの形成など、スナップショットにあらゆる種類の操作を実行できます。スナップショットのデータは変更できません。スナップショット・データには、それを開いた後に他のユーザーによって加えられた変更が反映されません。
ダイナセットは、データのリアルタイムのビューです。ダイナセットを戻すと、Microsoft Jetデータベース・エンジンはデータからキー値を抽出し、メモリーに格納します。ユーザーがダイナセットからデータの行を要求すると、Microsoft Jetデータベース・エンジンは、内部に格納されたキー値で実表を検索して、該当する行をフェッチします。ダイナセットをオープンすると、キー値のセットは変更できません。そのため、キー値が指すデータが変更されている場合があり、ユーザーに反映されていても、問合せの開始後に追加された新しい行はキー値セットに含まれず、ユーザーに表示されません。キーセットの問合せの実行後に削除した行は、キー値セットに含まれたままになります。ただし、これらの行は、ユーザーに表示される際に、#DELETED#
とマークされます。
ダイナセット・モデルは、強力で柔軟性のあるモデルであり、これを使用すると、PCを使用するユーザーでも、大量のデータを参照し、データを更新することができます。ダイナセットは、ローカル・データでは高速かつ効率的に使用できます。ただし、ダイナセット・モデルは、Microsoft AccessをOracleなどのRDBMSサーバーで使用した場合に、パフォーマンス上の重要な問題が発生します。
Microsoft Jetデータベース・エンジンでは、コミット時ロックおよび即時ロックを使用して、複数ユーザーによる更新を処理します。
Microsoft Jetデータベース・エンジンは、即時ロックを使用して編集した行を含むデータ・ページをハード・ロックします。他のユーザーは、ロックが解除されるまで、または変更がディスクに書き込まれるまで、ロックされた行を編集できません。
Microsoft Jetデータベース・エンジンとOracleを併用すると、コミット時ロック・スキームが使用されます。コミット時ロック・スキームでは、ソース表がハード・ロックされません。かわりに、変更をコミットする際、Microsoft Jetデータベース・エンジンによって、変更がポストされる前に他のユーザーがデータを変更していないかが確認されます。
Microsoft Jetデータベース・エンジンは、宣言参照整合性をサポートしています。これには、カスケードUPDATE
およびカスケードDELETES
での1対1および1対多のカーディナリティを持つ主キー/外部キーのリレーションシップが含まれます。
Microsoft Jetデータベース・エンジンの問合せプロセッサは、SQLの完全実装をサポートしていません。特に問合せでローカル表とリモート表の両方が参照される場合に、問合せを最適化します。Microsoft Jetデータベース・エンジンは、広範囲のデータソースと接続し、これらのすべてに対する問合せを処理できます。トランザクションのサポートは、固有のファイル形式のデータベース表に制限されます。Microsoft Jetデータベース・エンジンは、ODBC経由で接続されたRDBMSのトランザクション・サポートに依存しています。
Microsoft Jetデータベース・エンジンでは、明示的なトランザクション・モデルがサポートされています。トランザクションは、BeginTrans
文が実行されるまで開始されません。トランザクションは、CommitTrans
でコミットされ、Rollback
で強制終了されます。トランザクションは、複数の作業をグループ化する他に、パフォーマンスを向上させるためにも使用できます。あるプログラムで1つの表に対して多くの参照が発生する場合、1つのトランザクションに作業をグループ化することによって、Microsoft Jetデータベース・エンジンにメモリー内で操作を実行させることができます。その後、トランザクションがコミットされると、すべての作業がコミットされディスクに書き込まれます。ただし、このタイプのトランザクションは、Oracleに直接マップされない場合があります。
Oracle Databaseは強力で、柔軟性があり、スケーラブルなリレーショナル・データベース管理システム(RDBMS)・サーバーです。パーソナル・コンピュータから最大規模のメインフレームまで、広範囲にわたるコンピュータ・システムで動作します。また、Oracleは、クライアント/サーバー環境で効果的に動作するように設計されており、数百から数千人単位のユーザーをサポートします。
Oracleアーキテクチャは、バージョン参照機能付きのレコード・ロック(Microsoft Accessで提供されるページ・ロックではない)、拡張問合せ最適化、PL/SQLプログラミング言語、データ・レプリケーション、分散データベース管理、その他の重要な機能など、サーバー拡張機能をサポートしています。
この項で説明するアーキテクチャ機能は、Oracleの機能のうちの一部です。ここでは、Microsoft Accessとの連携に関する要素を中心に説明します。Oracleアーキテクチャの詳細は、Oracleサーバーのマニュアルを参照してください。次のマニュアルは、オンライン形式でCD-ROMにも格納されています。ガイドは次のとおりです。
『Oracle Database概要』
『Oracle Database管理者ガイド』
『Oracle Database PL/SQLユーザーズ・ガイドおよびリファレンス』
Oracle Databaseエラー・メッセージ
Oracleを使用すると、データとともにDBMSにコードを記述して保存できます。トリガー・コードを、各行または表全体のUPDATE
、INSERT
またはDELETE
イベントに関連付けることができます。また、イベントの前後にトリガーが実行されるように設定することもできます。たとえば、行の更新後にトリガーが実行されるように設定できます。
ストアド・プロシージャは、サーバーに事前コンパイル済形式で格納された汎用ルーチン(ファンクションまたはサブルーチンのいずれか)です。トリガーはストアド・プロシージャをコールできますが、トリガーは、表への行の挿入など、特定のデータベース・アクティビティによってのみアクティブ化されます。
Microsoft AccessをOracleとともに使用すると、トリガーおよびストアド・プロシージャによってMicrosoft Accessの機能がOracleとマップされます(たとえば、OracleでのMicrosoft AccessのAUTONUMBER
(COUNTER
)データ型のサポート)。
また、SQL Developerは、特定のMicrosoft Accessフィールドの検証規則をOracleのストアド・プロシージャに変換します。
PL/SQLプログラミング言語は、Pascalと同様のALGOLベースの言語です。PL/SQLは、近代的で高機能のプログラミング言語であり、例外処理機能を持ちます。PL/SQLを使用すると、Oracleでストアド・プログラムおよびトリガーを記述できます。また、Oracle Developer Suite製品のOracle Formsなど、Oracleの多くのクライアント側ツールで使用されるプログラミング言語でもあります。
順序は一意の番号ジェネレータであり、サーバー上の共有メモリーに実装されています。これは、主キーとして使用する、PL/SQLプログラム用の一意の値セットを提供するように設計されています。順序は、表ベースの一意の番号ジェネレータではシングルスレッドで実行する場合がある、高パフォーマンス・アプリケーション用に設計されています。順序をトリガー内の補助コードとともに使用して、Microsoft AccessのCOUNTER
フィールド型をエミュレートします。
Microsoft Accessとは異なり、Oracleでは暗黙的なトランザクション・モデルがサポートされています。各SQL文は、論理トランザクションの一部になります。論理トランザクションは最初のSQL文で開始し、Commit
文またはRollback
文で終了します。これらのいずれかの文の直後に、新しいトランザクションが次のSQL文で有効になります。
Microsoft Accessの開発者はトランザクションを使用して、Microsoft Jetデータベース・エンジンのパフォーマンスを向上できます。トランザクションのデータベース文をグループ化すると、Microsoft Jetデータベース・エンジンがすべてのデータベースの処理をメモリー上で完了しようとします。Microsoft Jetデータベース・エンジンは、トランザクションがコミットされるまで、ディスクへの書込みを遅延させます。このトランザクションの使用方法がOpen Database Connectivity(ODBC)を介してOracleにマップされると、Microsoft Jetデータベース・エンジンは最も外側にあるBegin
またはCommit
トランザクション要求のペアのみを送信します。Oracle は、処理の全期間にわたって、トランザクションを開いた状態で保持します。Microsoft AccessからOracleに移行する際、これを行うかどうかを決定する必要があります。
移行したMicrosoft Accessデータベースごとに、2つのデータベース・ユーザーがOracleモデルに作成されます。
Microsoft Accessデータベースの一意の名前と同じ名前のユーザー。このユーザーは、Microsoft Accessデータベースでユーザーが作成したオブジェクトに対応するOracleオブジェクトを所有します。
OMWB_EMULATION
という名前のユーザー。このユーザーは、Microsoft Accessの関数の制限付きサブセットをエミュレートするOracleオブジェクト(パッケージ、ストアド・プロシージャおよびタイプなど)を所有します。(これらの関数のエミュレーションを参照するには、Oracleモデルの階層でomwb_emulationユーザー・ツリーを開きます。)
データベース管理者は、Oracleを非常に柔軟に構成できます。パフォーマンスを向上するために、複数のディスクへのデータの書込みが可能です。また、ロールバックとリカバリのオプションを調整できます。各サーバーの構成が最適化されるようにコンピュータ・リソースを割り振ることができます。また、Oracleでは分散処理がサポートされているため、複数のシステム間でデータを分散できます。より高いレベルのユーザーを要求し、認証を使用するアプリケーション用に、Trusted Oracle Serverというバージョンのサーバーが提供されています。
OracleとMicrosoft Accessを併用すると、複数ユーザー・システムの堅牢性および信頼性が向上します。この場合、表全体ではなく、問合せ要求と結果のデータのみがネットワーク上で送信されるため、ネットワーク通信量が減少します。Microsoft Jetデータベース・エンジン・テクノロジは、適度な複数ユーザー機能を持つシングル・ユーザー・システムのパフォーマンスに焦点を置いています。Oracleは、複数ユーザーのパフォーマンス、ロールバックとリカバリ、および集中管理の問合せ処理に焦点を置いた、成熟した集中型サーバー・テクノロジです。
Microsoft AccessとOracleの組合せによって十分なパフォーマンスを得るためには、Microsoft Jetデータベース・エンジンが集中サーバーでどのように動作するのかを理解する必要があります。
図2-2は、Microsoft AccessがOracleと接続するにはODBCが必要であることを示しています。
ODBCは、クライアント・アプリケーションから異なるRDBMSサーバーへの接続を可能にするAPIです。Microsoft Jetデータベース・エンジンはODBCを効率的に使用するように設計され、レベル1のODBCドライバが必要です。Microsoft AccessがODBCを使用してリモートのRDBMSサーバーに接続すると、Microsoft Jetデータベース・エンジンはMicrosoft AccessのRDBMSエンジンとして機能し続けます。Microsoft Accessのフォーム、レポートおよびBasicコードは、.mdbファイル形式のローカル・データまたは共有データで使用する場合と同様に、Microsoft Jetデータベース・エンジンで継続して動作します。Microsoft Jetデータベース・エンジンは、リモートのOracle表を添付表として表示します。これらの添付表は、設計時に作成され、ローカル表として表示されます。
Microsoft Jetデータベース・エンジンでリモート表に対するダイナセットをサポートするために、Oracle表に主キーまたは一意索引が必要です。リモート表に主キーまたは一意索引が定義されていない場合、Microsof Jetデータベース・エンジンはその表に対して、編集できないスナップショットのみを開きます。
更新可能な表はMicrosoft Accessで定義できますが、主キーまたは一意索引は定義されません。これらの表をOracleに移行すると、表に主キーまたは一意索引がないため、Microsoft Accessでは更新できません。移行した表を更新する必要がある場合は、移行前に更新可能なMicrosoft Accessの表のすべてに主キーまたは一意索引を定義するか、表をOracleに移行した後に主キーまたは一意索引を定義する必要があります。更新はできても主キーまたは一意索引を持たない表にはすべて、「Log」ウィンドウに警告のフラグが立てられます。
ソース・データベースを取得する前に、この項の手順を完了することをお薦めします。また、Microsoft Accessデータベースの表名またはフィールド名に空白が含まれているか、31文字以上の場合は、この項の後半の「表名およびフィールド名の考慮点」を参照してください。Microsoft Accessデータベースの取得を準備するには、次の手順を実行します。
Microsoft Accessデータベース・ファイルのバックアップを作成します。
セキュリティを無効にします。セキュリティの詳細は、「Microsoft Accessのセキュリティ設定の無効化」を参照してください。
他のMicrosoft Accessデータベースにリンクされた表がアプリケーションに含まれている場合は、Microsoft Access IDE内のアプリケーションをオープンし、「Tools」→「Add Ins」→「Linked Table Manager」を選択してこれらのリンクを更新します。
注意: (他のMicrosoft Accessデータベースに)リンクされた表は、移行できます。SQL Developerは、移行された各Microsoft Accessデータベースに対応するOracle Database内にユーザー・スキーマを自動的に作成します。ただし、Oracle Databaseに単一のユーザー・スキーマが作成されるようにするには、すべての表を単一のMicrosoft Accessデータベースに移動することをお薦めします。 |
「Tools」→「Database」→「Compact Database」を選択して、Microsoft Accessデータベースを圧縮します。
注意: データベースがレプリカ・データベースでないことを確認します。SQL Developerでは、レプリカのMicrosoft Accessデータベースを移行できません。 |
次の考慮事項は、Microsoft Accessデータベースについて、空白が含まれるか、または表名およびフィールド名が31文字以上の場合に該当します。
名前に空白が含まれる場合、対応するOracleオブジェクトでは空白がアンダースコアに置き換えられます。たとえば、Microsoft Accessの表のフィールド名がTransaction IDの場合、Oracle表の列名は、移行した結果、Transaction_IDとなります。
31文字以上の名前の場合、対応するOracleオブジェクトでは30文字で切り捨てられます。必要に応じて、名前の最後の文字は、移行後のOracleの表名および列名が必ず一意となるように設定されます。
さらに、Microsoft Accessの表名またはフィールド名がOracleの予約語と競合した場合は、第3章の「Oracleの予約語」で説明するとおり、アンダースコアがOracleの表名または列名に追加されます。
SQL Developerでは、セキュリティが有効になっているMicrosoft Accessデータベースの移行はサポートされていません。データベースが保護されている場合、Exporter for Microsoft Accessアプリケーションを使用してMicrosoft AccessデータベースをXMLにエクスポートしようとすると、エラー・メッセージが表示されることがあります。デフォルトでは、SQL Developerによって、Microsoft Access MDBファイルの名前が移行先Oracleユーザーのユーザー名として使用されます。この方法でOracleユーザーを作成する場合、パスワードはORACLE
です。
SQL Developerを使用してMicrosoft Accessの表データを移行するには、保護されたデータベースの内容を新しいデータベースにコピーする必要があります。すべての内容(セキュリティ設定を除く)を新しいデータベースにコピーします。これで、Exporterツールを使用して、新しいMicrosoft AccessデータベースをXMLファイルにエクスポートできます。
保護されたデータベースの内容を新しいデータベースにコピーするには、次の手順を実行します。
Microsoft Accessで、「File」→「New Database」を選択します。
「Blank Database」アイコンを選択し、「OK」をクリックします。
新しいデータベースのファイル名および場所を指定して、「Create」をクリックします。
新しいデータベース内で、「File」→「Get External Data」→「Import」を選択します。
インポート対象の保護されたMicrosoft Accessデータベースを選択し、「Import」をクリックします。
「Import Objects」ダイアログ・ボックスで、「Options」をクリックします。「Relationships」オプションおよび「Definition and Data」オプションが選択されていることを確認します。
「Tables」タブで、「Select All」を選択します。
「OK」をクリックします。
Exporterツールを使用して、新しいMicrosoft AccessデータベースをXMLファイルにエクスポートします。データベースが正常に移行された場合、問題の原因はデータベースの保護によるものと考えられます。
Microsoft Accessアプリケーションのデータ管理部分をOracleに移行した後は、データの保護、およびPL/SQLでエンコードしたすべての参照整合性およびビジネス・ルールの保持をOracleに依存します。
これを基盤として、Microsoft Accessまたは図2-3に示すような広範なツールを使用してアプリケーションを拡張できます。
さらに、アプリケーションの規模が増大する場合は、アプリケーションに変更を加えることなくOracleサーバーをより大きいコンピュータに移動できます。
Oracleでは、Oracle Web DB、Oracle DeveloperおよびOracle Objects for OLEなどの高い生産性を備えたツールが提供されています。Oracle Objects for OLE(OO4O)は、OLE Automation Serversを制御できるVisual Basic、Delphiおよびその他のクライアント・ツールに向けた高パフォーマンス接続ソリューションです。これらのツールに関する情報は、Oracle Technology Network(OTN)の次のWebサイトを参照してください。
Microsoft Accessアプリケーションと連携してOracle Databaseを使用すると、動作上の違いに気が付くことがあります。その相違点について、次の項で説明します。
AUTONUMBER
列を持つMicrosoft Accessの表を使用すると、レコードへのデータの挿入を開始すると、AUTONUMBER
の値が表示されます。反対に、Oracleの表を参照するODBCリンク表を使用すると、レコードをコミットした後に、AUTONUMBER
の値が表示されます。
デフォルト値を持つMicrosoft Accessの表を使用すると、レコードへのデータの挿入を開始する前に、デフォルト値が表示されます。反対に、Oracleの表を参照するODBCリンク表を使用すると、レコードをコミットした後に、デフォルト値が表示されます。
ローカルのMicrosoft Accessの表を使用し、2つのフォームが同一レコードにアクセスした場合、1つのフォームでの変更がもう1つのフォームに即時に反映されます。ただし、Oracleの表を参照するODBCリンク表を使用すると、「Records」→「Refresh」オプションを選択してアプリケーションを更新するまで、1つのフォームでの変更がもう1つのフォームに反映されません。