Oracle® SQL Developer

Microsoft Accessからの移行のための追加情報

リリース3.0

B66845-01(原本部品番号:E18459-03)

2011年3月

このドキュメントでは、Microsoft AccessからOracleへの移行について説明しています。『Oracle SQL Developerユーザーズ・ガイド』の移行についての情報を補足しています。

Oracle SQL Developer Microsoft Accessからの移行のための追加情報, リリース3.0

B66845-01

Copyright © 1998, 2011, Oracle and/or its affiliates.All rights reserved.

原本著者: Chuck Murray

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントが、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供される場合は、次のNoticeが適用されます。

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007).Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、このソフトウェアまたはハードウェアを安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle およびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXはX/Open Company, Ltd.によってライセンス提供された登録商標です。

このソフトウェアまたはハードウェアおよびドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

目次

図一覧

表一覧

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

1 概要

2 移行プロセス

- 2.1 Microsoft Accessアーキテクチャの概要

- 2.1.1 Microsoft Jetデータベース・エンジンのレコードセット

- 2.1.2 Microsoft Jetデータベース・エンジンの複数ユーザーによる更新

- 2.1.3 Microsoft Jetデータベース・エンジンで施行される参照整合性

- 2.1.4 Microsoft Jetデータベース・エンジンの問合せプロセッサ

- 2.1.5 Microsoft Jetデータベース・エンジンのトランザクション

- 2.2 Oracleアーキテクチャの概要

- 2.2.1 トリガーとストアド・プロシージャ

- 2.2.2 PL/SQLプログラミング言語

- 2.2.3 順序

- 2.2.4 トランザクション

- 2.2.5 データベース・ユーザー

- 2.2.6 その他のOracle機能

- 2.3 Microsoft Jetデータベース・エンジン、ODBCおよびOracleのアーキテクチャの比較

- 2.4 Microsoft Accessデータベースの取得準備

- 2.4.1 表名およびフィールド名の考慮点

- 2.5 Microsoft Accessのセキュリティ設定の無効化

- 2.6 アプリケーションの拡張

- 2.7 バックエンドとしてのOracleの使用

- 2.7.1 AUTONUMBERオプション

- 2.7.2 デフォルト・オプション

- 2.7.3 同一レコードにアクセスする複数のフォーム

3 データ型、予約語およびその他のデータベース・オブジェクト

- 3.1 Oracleのデータ型

- 3.2 Microsoft Access Jetのデータ型

- 3.3 デフォルトのデータ型マッピング

- 3.4 Oracleの予約語

- 3.5 Microsoft Accessの問合せ

- 3.5.1 パラメータを使用するMicrosoft Accessの問合せ

- 3.6 ピボット・テーブルを作成するMicrosoft AccessのTRANSFORM文

4 トラブルシューティング

- 4.1 Microsoft Accessセキュリティの解除

- 4.2 問合せによるリレーションの移行

- 4.3 表に対する主キーの定義

- 4.4 Microsoft Access ODBCデータソースを使用した表データの移行

- 4.5 データ移行時の不適切なブール値

- 4.6 Microsoft Accessデータベースの変更時のエラー

5 アプリケーションのパフォーマンス・チューニング

- 5.1 ODBCドライバの選択

- 5.2 サーバーベースのパラメータ表の使用

- 5.3 アプリケーションの起動パフォーマンスの改善

- 5.4 Microsoft Jetデータベース・エンジンの動作の高速化

- 5.5 Microsoft Jetデータベース・エンジンの排除

- 5.5.1 条件および制限付きの問合せ

- 5.5.2 スナップショットとダイナセット

- 5.5.3 ドロップダウン・リストの使用の比較

A Microsoft Accessのエラー・メッセージ

- A.1 エラー・メッセージのクラス

- A.2 Microsoft Jetデータベース・エンジンのエラー・メッセージ

B コードおよび問合せのサンプル

- B.1 AUTONUMBERデータ型のエミュレーション

- B.2 名前マッピング問合せ

- B.3 デフォルト値

- B.4 列および表の検証

- B.5 CASCADE UPDATEトリガー・コード

索引

図一覧

- 2-1 Microsoft Accessアーキテクチャ

- 2-2 Microsoft Access/ODBC/Oracleアーキテクチャ

- 2-3 クライアント・ツールの組合せによるアプリケーションの拡張

表一覧

- 3-1 サポートされているOracleのデータ型

- 3-2 Microsoft Access Jetのデータ型

- 3-3 SQL Developerで使用されるデフォルトのデータ型マッピング

- 3-4 問合せの移行時におけるMicrosoft Access機能の変換

- 5-1 レジストリ・キーの場所

- A-1 エラー・メッセージのクラス

- A-2 Microsoft Jetデータベース・エンジンのエラー・メッセージ

はじめに

このマニュアルでは、Microsoft Access 97、2000、XP(2002)、2003または2007からOracleにデータベースを移行する方法について、その追加情報を示します。Microsoft AccessとOracleの違いについて説明します。また、変換処理中にOracle SQL Developerがそれらの違いをどのように処理するかの概要も説明します。

対象読者

このマニュアルは、SQL Developerを使用してMicrosoft AccessデータベースをOracleに移行するすべてのユーザーを対象としています。

ユーザーは、リレーショナル・データベースの概要を理解している必要があります。また、Microsoft AccessとOracleを実行しているオペレーティング・システム環境についての理解も必要です。

ドキュメントのアクセシビリティについて

オラクル社のアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/us/corporate/accessibility/index.htmlを参照してください。

Oracleサポートへのアクセス

Oracleカスタマは、My Oracle Supportから電子サポートにアクセスできます。詳細は、http://www.oracle.com/support/contact.htmlまたはhttp://www.oracle.com/accessibility/support.html(聴覚障害者向け)を参照してください。

関連ドキュメント

Oracle SQL Developerの使用方法については、『Oracle SQL Developerユーザーズ・ガイド』およびSQL Developerのオンライン・ヘルプを参照してください。

Oracle SQL Developerのインストール方法については、『Oracle SQL Developerインストレーション・ガイド』を参照してください。

Oracleエラー・メッセージのドキュメントは、HTML版のみが存在します。Oracle Database JP Documentation Libraryを使用する場合は、エラー・メッセージを範囲ごとに参照できます。特定の範囲のページを表示したら、ブラウザの「このページの検索」機能を使用して特定のメッセージを検索できます。インターネットに接続できる場合、Oracleオンライン・ドキュメントのエラー・メッセージ検索機能を使用して特定のエラー・メッセージを検索できます。

リリース・ノート、インストール・マニュアル、ホワイト・ペーパーまたはその他の関連ドキュメントは、次のOTN(Oracle Technology Network)から、無償でダウンロードできます。

http://www.oracle.com/technetwork/

OTN WebサイトのドキュメントのセクションのURLは次のとおりです。

http://www.oracle.com/technetwork/indexes/documentation/

表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

1 概要

このマニュアルでは、Oracle SQL Developerツールを使用してMicrosoft AccessデータベースをOracleに移行する方法について、その追加情報を示します。移行の計画に役立つ情報と、移行中や移行後に発生する可能性のある問題を解決するための情報を示します。

移行機能など、SQL Developerツールの使用方法を理解している必要があります。SQL Developerについては、『Oracle SQL Developerユーザーズ・ガイド』およびオンライン・ヘルプを参照してください。

追加情報は次のとおりです。

- 第2章「移行プロセス」

- 第3章「データ型、予約語およびその他のデータベース・オブジェクト」

- 第4章「トラブルシューティング」

- 第5章「アプリケーションのパフォーマンス・チューニング」

- 付録A「Microsoft Accessのエラー・メッセージ」

- 付録B「コードおよび問合せのサンプル」

2 移行プロセス

この章では、Microsoft AccessとOracleの両方のアーキテクチャの概要を示して、移行プロセスの概要を説明します。内容は次のとおりです。

- 2.1 Microsoft Accessアーキテクチャの概要

- 2.2 Oracleアーキテクチャの概要

- 2.3 Microsoft Jetデータベース・エンジン、ODBCおよびOracleのアーキテクチャの比較

- 2.4 Microsoft Accessデータベースの取得準備

- 2.5 Microsoft Accessのセキュリティ設定の無効化

- 2.6 アプリケーションの拡張

- 2.7 バックエンドとしてのOracleの使用

2.1 Microsoft Accessアーキテクチャの概要

Microsoft Accessでは、Microsoft Jetデータベース・エンジンというファイル・サーバーDBMSテクノロジをベースとしています。Microsoft Accessのフォーム、レポートおよびBasicコードは、Microsoft Jetデータベース・エンジンに依存し、固有のデータベース・ファイル形式(Access 2003以下のリリースでは.mdb、その後のリリースでは.accdb)で格納されたデータを管理します。図2-1に、Microsoft Accessのアーキテクチャを示します。

図2-1 Microsoft Accessアーキテクチャ

シングル・ユーザーのMicrosoft Accessアプリケーションでは、データベース・ファイルとMicrosoft Accessは同一システムに配置されます。複数ユーザーのMicrosoft Accessアプリケーションでは、データベース・ファイルはファイル・サーバーに配置され、共有されます。各クライアントは、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サーバーへのアクセスが可能になります。

2.1.1 Microsoft Jetデータベース・エンジンのレコードセット

Microsoft Jetデータベース・エンジンが問合せを処理すると、レコードの結果セットに対してレコードセット(カーソル)を戻します。Microsoft Jetデータベース・エンジンでは、スナップショット・タイプとダイナセット・タイプのレコードセットがサポートされています。

スナップショットは、問合せの実行時に存在していたデータの静止イメージです。スナップショットを戻すと、Microsoft Jetデータベース・エンジンは問合せを完了し、すべての結果行および列を仮想表に抽出し、この仮想表をユーザーに表示します。スナップショットのユーザーは、スナップショットの問合せやスナップショットに基づいたフォームおよびレポートの形成など、スナップショットにあらゆる種類の操作を実行できます。スナップショットのデータは変更できません。スナップショット・データには、それを開いた後に他のユーザーによって加えられた変更が反映されません。

ダイナセットは、データのリアルタイムのビューです。ダイナセットを戻すと、Microsoft Jetデータベース・エンジンはデータからキー値を抽出し、メモリーに格納します。ユーザーがダイナセットからデータの行を要求すると、Microsoft Jetデータベース・エンジンは、内部に格納されたキー値で実表を検索して、該当する行をフェッチします。ダイナセットをオープンすると、キー値のセットは変更できません。そのため、キー値が指すデータが変更されている場合があり、ユーザーに反映されていても、問合せの開始後に追加された新しい行はキー値セットに含まれず、ユーザーに表示されません。キーセットの問合せの実行後に削除した行は、キー値セットに含まれたままになります。ただし、これらの行は、ユーザーに表示される際に、#DELETED#とマークされます。

ダイナセット・モデルは、強力で柔軟性のあるモデルであり、これを使用すると、PCを使用するユーザーでも、大量のデータを参照し、データを更新することができます。ダイナセットは、ローカル・データでは高速かつ効率的に使用できます。ただし、ダイナセット・モデルは、Microsoft AccessをOracleなどのRDBMSサーバーで使用した場合に、パフォーマンス上の重要な問題が発生します。

2.1.2 Microsoft Jetデータベース・エンジンでの複数ユーザーによる更新

Microsoft Jetデータベース・エンジンでは、コミット時ロックおよび即時ロックを使用して、複数ユーザーによる更新を処理します。

Microsoft Jetデータベース・エンジンは、即時ロックを使用して編集した行を含むデータ・ページをハード・ロックします。他のユーザーは、ロックが解除されるまで、または変更がディスクに書き込まれるまで、ロックされた行を編集できません。

Microsoft Jetデータベース・エンジンとOracleを併用すると、コミット時ロック・スキームが使用されます。コミット時ロック・スキームでは、ソース表がハード・ロックされません。かわりに、変更をコミットする際、Microsoft Jetデータベース・エンジンによって、変更がポストされる前に他のユーザーがデータを変更していないかが確認されます。

2.1.3 Microsoft Jetデータベース・エンジンで施行される参照整合性

Microsoft Jetデータベース・エンジンは、宣言参照整合性をサポートしています。これには、カスケードUPDATEおよびカスケードDELETESでの1対1および1対多のカーディナリティを持つ主キー/外部キーのリレーションシップが含まれます。

2.1.4 Microsoft Jetデータベース・エンジンの問合せプロセッサ

Microsoft Jetデータベース・エンジンの問合せプロセッサは、SQLの完全実装をサポートしていません。特に問合せでローカル表とリモート表の両方が参照される場合に、問合せを最適化します。Microsoft Jetデータベース・エンジンは、広範囲のデータソースと接続し、これらのすべてに対する問合せを処理できます。トランザクションのサポートは、固有のファイル形式のデータベース表に制限されます。Microsoft Jetデータベース・エンジンは、ODBC経由で接続されたRDBMSのトランザクション・サポートに依存しています。

2.1.5 Microsoft Jetデータベース・エンジンのトランザクション

Microsoft Jetデータベース・エンジンでは、明示的なトランザクション・モデルがサポートされています。トランザクションは、BeginTrans文が実行されるまで開始されません。トランザクションは、CommitTransでコミットされ、Rollbackで強制終了されます。トランザクションは、複数の作業をグループ化する他に、パフォーマンスを向上させるためにも使用できます。あるプログラムで1つの表に対して多くの参照が発生する場合、1つのトランザクションに作業をグループ化することによって、Microsoft Jetデータベース・エンジンにメモリー内で操作を実行させることができます。その後、トランザクションがコミットされると、すべての作業がコミットされディスクに書き込まれます。ただし、このタイプのトランザクションは、Oracleに直接マップされない場合があります。

2.2 Oracleアーキテクチャの概要

Oracle Databaseは強力で、柔軟性があり、スケーラブルなリレーショナル・データベース管理システム(RDBMS)・サーバーです。パーソナル・コンピュータから最大規模のメインフレームまで、広範囲にわたるコンピュータ・システムで動作します。また、Oracleは、クライアント/サーバー環境で効果的に動作するように設計されており、数百から数千人単位のユーザーをサポートします。

Oracleアーキテクチャは、バージョン参照機能付きのレコード・ロック(Microsoft Accessで提供されるページ・ロックではない)、拡張問合せ最適化、PL/SQLプログラミング言語、データ・レプリケーション、分散データベース管理、その他の重要な機能など、サーバー拡張機能をサポートしています。

この項で説明するアーキテクチャ機能は、Oracleの機能のうちの一部です。ここでは、Microsoft Accessとの連携に関する要素を中心に説明します。Oracleアーキテクチャの詳細は、『Oracle Database概要』を参照してください。次のものも参照してください。

- 『Oracle Database管理者ガイド』

- 『Oracle Database PL/SQL言語リファレンス』

2.2.1 トリガーとストアド・プロシージャ

Oracleを使用すると、データとともにDBMSにコードを記述して保存できます。トリガー・コードを、各行または表全体のUPDATE、INSERTまたはDELETEイベントに関連付けることができます。また、イベントの前後にトリガーが実行されるように設定することもできます。たとえば、行の更新後にトリガーが実行されるように設定できます。

ストアド・プロシージャは、サーバーに事前コンパイル済形式で格納された汎用ルーチン(ファンクションまたはサブルーチンのいずれか)です。トリガーはストアド・プロシージャをコールできますが、トリガーは、表への行の挿入など、特定のデータベース・アクティビティによってのみアクティブ化されます。

Microsoft AccessをOracleとともに使用すると、トリガーおよびストアド・プロシージャによってMicrosoft Accessの機能がOracleとマップされます(たとえば、OracleでのMicrosoft AccessのAUTONUMBER(COUNTER)データ型のサポート)。

また、SQL Developerは、特定のMicrosoft Accessフィールドの検証規則をOracleのストアド・プロシージャに変換します。

2.2.2 PL/SQLプログラミング言語

PL/SQLプログラミング言語は、Pascalと同様のALGOLベースの言語です。PL/SQLは、近代的で高機能のプログラミング言語であり、例外処理機能を持ちます。PL/SQLを使用すると、Oracleでストアド・プログラムおよびトリガーを記述できます。また、Oracle Developer Suite製品のOracle Formsなど、Oracleの多くのクライアント側ツールで使用されるプログラミング言語でもあります。

2.2.3 順序

順序は一意の番号ジェネレータであり、サーバー上の共有メモリーに実装されています。これは、主キーとして使用する、PL/SQLプログラム用の一意の値セットを提供するように設計されています。順序は、表ベースの一意の番号ジェネレータではシングルスレッドで実行する場合がある、高パフォーマンス・アプリケーション用に設計されています。順序をトリガー内の補助コードとともに使用して、Microsoft AccessのCOUNTERフィールド型をエミュレートします。

2.2.4 トランザクション

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に移行する際、これを行うかどうかを決定する必要があります。

2.2.5 データベース・ユーザー

移行したMicrosoft Accessデータベースごとに、2つのデータベース・ユーザーがOracleモデルに作成されます。

- Microsoft Accessデータベースの一意の名前と同じ名前のユーザー。このユーザーは、Microsoft Accessデータベースでユーザーが作成したオブジェクトに対応するOracleオブジェクトを所有します。

- OMWB_EMULATIONという名前のユーザー。このユーザーは、Microsoft Accessの関数の制限付きサブセットをエミュレートするOracleオブジェクト(パッケージ、ストアド・プロシージャおよびタイプなど)を所有します。(これらの関数のエミュレーションを参照するには、Oracleモデルの階層でomwb_emulationユーザー・ツリーを開きます。)

2.2.6 その他のOracle機能

データベース管理者は、Oracleを非常に柔軟に構成できます。パフォーマンスを向上するために、複数のディスクへのデータの書込みが可能です。また、ロールバックとリカバリのオプションを調整できます。各サーバーの構成が最適化されるようにコンピュータ・リソースを割り振ることができます。また、Oracleでは分散処理がサポートされているため、複数のシステム間でデータを分散できます。より高いレベルのユーザーを要求し、認証を使用するアプリケーション用に、Trusted Oracle Serverというバージョンのサーバーが提供されています。

2.3 Microsoft Jetデータベース・エンジン、ODBCおよびOracleのアーキテクチャの比較

OracleとMicrosoft Accessを併用すると、複数ユーザー・システムの堅牢性および信頼性が向上します。この場合、表全体ではなく、問合せ要求と結果のデータのみがネットワーク上で送信されるため、ネットワーク通信量が減少します。Microsoft Jetデータベース・エンジン・テクノロジは、適度な複数ユーザー機能を持つシングル・ユーザー・システムのパフォーマンスに焦点を置いています。Oracleは、複数ユーザーのパフォーマンス、ロールバックとリカバリ、および集中管理の問合せ処理に焦点を置いた、成熟した集中型サーバー・テクノロジです。

Microsoft AccessとOracleの組合せによって十分なパフォーマンスを得るためには、Microsoft Jetデータベース・エンジンが集中サーバーでどのように動作するのかを理解する必要があります。

図2-2は、Microsoft AccessがOracleと接続するにはODBCが必要であることを示しています。

図2-2 Microsoft Access/ODBC/Oracleアーキテクチャ

ODBCは、クライアント・アプリケーションから異なるRDBMSサーバーへの接続を可能にするAPIです。Microsoft Jetデータベース・エンジンはODBCを効率的に使用するように設計され、レベル1のODBCドライバが必要です。Microsoft AccessがODBCを使用してリモートのRDBMSサーバーに接続すると、Microsoft Jetデータベース・エンジンはMicrosoft AccessのRDBMSエンジンとして機能し続けます。Microsoft Accessのフォーム、レポートおよびBasicコードは、固有のデータベース・ファイル形式のローカル・データまたは共有データで使用する場合と同様に、Microsoft Jetデータベース・エンジンで継続して動作します。Microsoft Jetデータベース・エンジンは、リモートのOracle表を添付表として表示します。これらの添付表は、設計時に作成され、ローカル表として表示されます。

Microsoft Jetデータベース・エンジンでリモート表に対するダイナセットをサポートするために、Oracle表に主キーまたは一意索引が必要です。リモート表に主キーまたは一意索引が定義されていない場合、Microsof Jetデータベース・エンジンはその表に対して、編集できないスナップショットのみを開きます。

更新可能な表はMicrosoft Accessで定義できますが、主キーまたは一意索引は定義されません。これらの表をOracleに移行すると、表に主キーまたは一意索引がないため、Microsoft Accessでは更新できません。移行した表を更新する必要がある場合は、移行前に更新可能なMicrosoft Accessの表のすべてに主キーまたは一意索引を定義するか、表をOracleに移行した後に主キーまたは一意索引を定義する必要があります。更新はできても主キーまたは一意索引を持たない表にはすべて、「Log」ウィンドウに警告のフラグが立てられます。

2.4 Microsoft Accessデータベースの取得準備

ソース・データベースを取得する前に、この項の手順を完了することをお薦めします。また、Microsoft Accessデータベースの表名またはフィールド名に空白が含まれているか、31文字以上の場合は、この項の後半の「表名およびフィールド名の考慮点」を参照してください。Microsoft Accessデータベースの取得を準備するには、次の手順を実行します。

1. Microsoft Accessデータベース・ファイルのバックアップを作成します。

2. セキュリティを無効にします。セキュリティの詳細は、「Microsoft Accessのセキュリティ設定の無効化」を参照してください。

3. 他のMicrosoft Accessデータベースにリンクされた表がアプリケーションに含まれている場合は、Microsoft Access IDE内のアプリケーションをオープンし、「Tools」→「Add Ins」→「Linked Table Manager」を選択してこれらのリンクを更新します。

注意:
(他のMicrosoft Accessデータベースに)リンクされた表は、移行できます。SQL Developerは、移行された各Microsoft Accessデータベースに対応するOracle Database内にユーザー・スキーマを自動的に作成します。ただし、Oracle Databaseに単一のユーザー・スキーマが作成されるようにするには、すべての表を単一のMicrosoft Accessデータベースに移動することをお薦めします。

4. 「Tools」→「Database」→「Compact Database」を選択して、Microsoft Accessデータベースを圧縮します。

注意:
データベースがレプリカ・データベースでないことを確認します。SQL Developerでは、レプリカのMicrosoft Accessデータベースを移行できません。

2.4.1 表名およびフィールド名の考慮点

次の考慮事項は、Microsoft Accessデータベースについて、空白が含まれるか、または表名およびフィールド名が31文字以上の場合に該当します。

- 名前に空白が含まれる場合、対応するOracleオブジェクトでは空白がアンダースコアに置き換えられます。たとえば、Microsoft Accessの表のフィールド名がTransaction IDの場合、Oracle表の列名は、移行した結果、Transaction_IDとなります。

- 31文字以上の名前の場合、対応するOracleオブジェクトでは30文字で切り捨てられます。必要に応じて、名前の最後の文字は、移行後のOracleの表名および列名が必ず一意となるように設定されます。

さらに、Microsoft Accessの表名またはフィールド名がOracleの予約語と競合した場合は、第3章の「Oracleの予約語」で説明するとおり、アンダースコアがOracleの表名または列名に追加されます。

2.5 Microsoft Accessのセキュリティ設定の無効化

SQL Developerでは、セキュリティが有効になっているMicrosoft Accessデータベースの移行はサポートされていません。データベースが保護されている場合、Exporter for Microsoft Accessアプリケーションを使用してMicrosoft AccessデータベースをXMLにエクスポートしようとすると、エラー・メッセージが表示されることがあります。デフォルトでは、SQL Developerは、Microsoft Accessデータベース・ファイルの名前を移行先のOracleユーザーのユーザー名として使用します。この方法でOracleユーザーを作成する場合、パスワードはORACLEです。

SQL Developerを使用してMicrosoft Accessの表データを移行するには、保護されたデータベースの内容を新しいデータベースにコピーする必要があります。すべての内容(セキュリティ設定を除く)を新しいデータベースにコピーします。これで、Exporterツールを使用して、新しいMicrosoft AccessデータベースをXMLファイルにエクスポートできます。

保護されたデータベースの内容を新しいデータベースにコピーするには、次の手順を実行します。

1. Microsoft Accessで、「File」→「New Database」を選択します。

2. 「Blank Database」アイコンを選択し、「OK」をクリックします。

3. 新しいデータベースのファイル名および場所を指定して、「Create」をクリックします。

4. 新しいデータベース内で、「File」→「Get External Data」→「Import」を選択します。

5. インポート対象の保護されたMicrosoft Accessデータベースを選択し、「Import」をクリックします。

6. 「Import Objects」ダイアログ・ボックスで、「Options」をクリックします。「Relationships」オプションおよび「Definition and Data」オプションが選択されていることを確認します。

7. 「Tables」タブで、「Select All」を選択します。

8. 「OK」をクリックします。

9. Exporterツールを使用して、新しいMicrosoft AccessデータベースをXMLファイルにエクスポートします。データベースが正常に移行された場合、問題の原因はデータベースの保護によるものと考えられます。

2.6 アプリケーションの拡張

Microsoft Accessアプリケーションのデータ管理部分をOracleに移行した後は、データの保護、およびPL/SQLでエンコードしたすべての参照整合性およびビジネス・ルールの保持をOracleに依存します。

これを基盤として、Microsoft Accessまたは図2-3に示すような広範なツールを使用してアプリケーションを拡張できます。

図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サイトを参照してください。

http://www.oracle.com/technology

2.7 バックエンドとしてのOracleの使用

Microsoft Accessアプリケーションと連携してOracle Databaseを使用すると、動作上の違いに気が付くことがあります。その相違点について、次の項で説明します。

- AUTONUMBERオプション

- デフォルト・オプション

- 同一レコードにアクセスする複数のフォーム

2.7.1 AUTONUMBERオプション

AUTONUMBER列を持つMicrosoft Accessの表を使用すると、レコードへのデータの挿入を開始すると、AUTONUMBERの値が表示されます。反対に、Oracleの表を参照するODBCリンク表を使用すると、レコードをコミットした後に、AUTONUMBERの値が表示されます。

2.7.2 デフォルト・オプション

デフォルト値を持つMicrosoft Accessの表を使用すると、レコードへのデータの挿入を開始する前に、デフォルト値が表示されます。反対に、Oracleの表を参照するODBCリンク表を使用すると、レコードをコミットした後に、デフォルト値が表示されます。

2.7.3 同一レコードにアクセスする複数のフォーム

ローカルのMicrosoft Accessの表を使用し、2つのフォームが同一レコードにアクセスした場合、1つのフォームでの変更がもう1つのフォームに即時に反映されます。ただし、Oracleの表を参照するODBCリンク表を使用すると、「Records」→「Refresh」オプションを選択してアプリケーションを更新するまで、1つのフォームでの変更がもう1つのフォームに反映されません。

3 データ型、予約語およびその他のデータベース・オブジェクト

この章では、データ型、予約語、関数、問合せおよびピボット・テーブルを作成するTRANSFORM文について説明します。内容は次のとおりです。

- 3.1 サポートされているOracleデータ型

- 3.2 Microsoft Access Jetのデータ型

- 3.3 デフォルトのデータ型マッピング

- 3.4 Oracleの予約語

- 3.5 Microsoft Accessの問合せ

- 3.6 ピボット・テーブルを作成するMicrosoft AccessのTRANSFORM文

3.1 Oracleのデータ型

表3-1に、SQL DeveloperがサポートするOracleのデータ型を示します。

表3-1 サポートされているOracleデータ型

データ型

説明

BLOB

バイナリ・ラージ・オブジェクト。最大サイズは4GBです。

CHAR

バイト単位の長さの固定長文字データ。最大サイズは2000バイトです。デフォルトおよび最小サイズは1バイトです。

CLOB

シングルバイト文字を含むキャラクタ・ラージ・オブジェクト。固定幅および可変幅のキャラクタ・セットがサポートされます。両方のキャラクタ・セットでCHARデータベース・キャラクタ・セットを使用します。最大サイズは4GBです。

DATE

DATEデータ型には、日時情報が格納されます。日時情報はCHARおよびNUMBERの両方のデータ型で表すことができますが、DATEデータ型には特別な関連プロパティが含まれます。DATE型の各値に対して、世紀、年、月、日、時間、分、秒などの情報が格納されます。

FLOAT

38桁の10進精度(126桁のバイナリ精度)の浮動小数点数。

LONG

最大2GB(231-1バイト数)の可変長文字データ。

LONG RAW

最大2GBの可変長RAWバイナリ・データ。

NCHAR

文字単位またはバイト単位(各国語キャラクタ・セットの選択によって異なる)の長さの固定長文字データ。最大サイズは、それぞれの文字を格納するために必要なバイト数によって決定されます。上限は2000バイトです。デフォルトおよび最小サイズは、1文字または1バイト(キャラクタ・セットによって異なる)です。

NCLOB

マルチバイト・キャラクタを含むキャラクタ・ラージ・オブジェクト。固定幅および可変幅のキャラクタ・セットがサポートされます。両方のキャラクタ・セットでNCHARデータベース・キャラクタ・セットを使用します。最大サイズは4GBです。各国語キャラクタ・セットのデータを格納します。

NUMBER

精度(p)とスケール(s)を持つ数字。精度(p)の範囲は1から38です。スケール(s)の範囲は-84から127です。

NVARCHAR2

最大長が文字単位またはバイト単位(各国語キャラクタ・セットの選択によって異なる)の可変長文字列。最大サイズは、それぞれの文字を格納するために必要なバイト数によって決定されます。上限は4000バイトです。NVARCHAR2には、サイズを指定する必要があります。

RAW

バイト単位の長さのRAWバイナリ・データ。最大サイズは2000バイトです。RAW値にサイズを指定する必要があります。

VARCHAR

現在、VARCHARデータ型はVARCHAR2データ型と同義です。VARCHARのかわりにVARCHAR2を使用することをお薦めします。

Oracleデータ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

3.2 Microsoft Access Jetのデータ型

表3-2に、Microsoft Access Jetデータ型を示します。

表3-2 Microsoft Access Jetのデータ型

データ型

説明

最小値

最大値

Text

可変長のテキスト

1

255

Memo

可変長の長いテキスト

1

64,000バイト

Number Byte

1バイト記憶域

0

255

Number Integer

2バイト記憶域

-32,768

32,767

Number Long Integer

4バイト記憶域

-2,147,483,648

2,147,483,647

Number Single

4バイト記憶域

-3.4 x 10^38

3.4 x 10^38

Number Double

8バイト記憶域

-1.8 x 10^308

1.8 x 10^308

Currency

8バイト記憶域(通貨)

-922337203685477.5808

922337203685477.5808

Counter Yes/No

4バイトの記憶域(AutoIncrementフィールド)1ビットの記憶域(ブール値)

0

2,147,483,647

Date/Time

8バイト記憶域

OLE Object

OLE(図形や他の複雑なデータ)

1

1.2GB

3.3 デフォルトのデータ型マッピング

表3-3に、Microsoft AccessからOracleへデータ型を変換するためにSQL Developerによって使用されるデフォルト設定を示します。SQL Developerを使用すると、代替の型を指定して特定のデータ型のデフォルト設定を変更できます。これを行うには、「Captured Objects」ナビゲータで対象となる取得モデルを右クリックし、「データ・マッピングの設定」を選択します。表3-3に、デフォルトのマッピングを示します。

デフォルトのデータ型マッピングを変更する方法の詳細は、SQL Developerのオンライン・ヘルプを参照してください。

表3-3 SQL Developerで使用されるデフォルトのデータ型マッピング

Microsoft Accessのデータ型

Oracleデータ型

Boolean

NUMBER(1, 0)

Byte

NUMBER(3, 0)

Currency

Number (15, 4)

Date

DATE

Double

FLOAT(126)

Integer

NUMBER(5, 0)

Long

NUMBER(11, 0)

LongBinary

BLOB

Memo

CLOB

Single

FLOAT(126)

Text

VARCHAR2

3.4 Oracleの予約語

次の表に、Oracleで予約されている語を示します。これらの予約語と競合するオブジェクト名には、SQL Developerによってアンダースコアが追加されます。

ABORT

ACCEPT

ACCESS

ADD

ALL

ALTER

AND

ANY

ARRAY

ARRAYLEN

AS

ASC

ASSERT

ASSIGN

AT

AUDIT

AUTHORIZATION

AVG

BASE_TABLE

BEGIN

BETWEEN

BINARY_INTEGER

BODY

BOOLEAN

BY

CASE

CHAR

CHAR_BASE

CHECK

CLOSE

CLUSTER

CLUSTERS

COLAUTH

COLUMN

COMMENT

COMMIT

COMPRESS

CONNECT

CONSTANT

CRASH

CREATE

CURRENT

CURRVAL

CURSOR

DATA_BASE

DATABASE

DATE

DBA

DEBUGOFF

DEBUGON

DECIMAL

DECLARE

DEFAULT

DEFINITION

DELAY

DELETE

DESC

DIGITS

DISPOSE

DISTINCT

DO

DROP

ELSE

ELSIF

END

ENTRY

EXCEPTION

EXCEPTION_INIT

EXCLUSIVE

EXISTS

EXIT

FALSE

FETCH

FILE

FLOAT

FOR

FORM

FROM

FUNCTION

GENERIC

GOTO

GRANT

GROUP

HAVING

IDENTIFIED

IF

IMMEDIATE

IN

INCREMENT

INDEX

INDEXES

INDICATOR

INITIAL

INSERT

INTEGER

INTERFACE

INTERSECT

INTO

IS

LEVEL

LIKE

LIMITED

LOCK

LONG

LOOP

MAX

MAXEXTENTS

MIN

MINUS

MLSLABEL

MOD

MODE

MODIFY

NATURAL

NATURALN

NETWORK

NEW

NEXTVAL

NOAUDIT

NOCOMPRESS

NOT

NOWAIT

NULL

NUMBER

NUMBER_BASE

OF

OFFLINE

ON

ONLINE

OPEN

OPTION

OR

ORDER

OTHERS

OUT

PACKAGE

PARTITION

PCTFREE

PLS_INTEGER

POSITIVE

POSITIVEN

PRAGMA

PRIOR

PRIVATE

PRIVILEGES

PROCEDURE

PUBLIC

RAISE

RANGE

RAW

REAL

RECORD

REF

RELEASE

REMR

RENAME

RESOURCE

RETURN

REVERSE

REVOKE

ROLLBACK

ROW

ROWID

ROWLABEL

ROWNUM

ROWS

ROWTYPE

RUN

SAVEPOINT

SCHEMA

SELECT

SEPERATE

SESSION

SET

SHARE

SIGNTYPE

SIZE

SMALLINT

SPACE

SQL

SQLCODE

SQLERRM

START

STATEMENT

STDDEV

SUBTYPE

SUCCESSFUL

SUM

SYNONYM

SYSDATE

TABAUTH

TABLE

TABLES

TASK

TERMINATE

THEN

TO

TRIGGER

TRUE

TYPE

UID

UNION

UNIQUE

UPDATE

USE

USER

VALIDATE

VALUES

VARCHAR

VARCHAR2

VARIANCE

VIEW

VIEWS

WHEN

WHENEVER

WHERE

WHILE

WITH

WORK

WRITE

XOR

3.5 Microsoft Accessの問合せ

Microsoft Accessの問合せは、Oracleのビューに変換されます。この項では、問合せを移行する際の考慮点およびMicrosoft Accessの機能をOracleモデルにマッピングする方法について説明します。

Microsoft Accessの問合せの移行には、次の考慮事項があります。

- Oracleでは、2ステップのプロセス(パラメータの設定とビューのコール)でビューを使用します。Accessでは、ユーザーはパラメータ値を求めるプロンプトを表示できます。パラメータ付きの問合せの詳細は、「パラメータを使用するMicrosoft Accessの問合せ」を参照してください。

- 依存するオブジェクトが存在しない場合でも作成できるように、ビューはFORCEオプションで作成します。(依存する他のビューや表を後で作成する場合もあるため、この方法でビューを作成する必要があります。)
したがって、移行後は、どちらが有効かを確認するためにビューを再コンパイルするか、エラーまたは問題に関する情報を確認するためにFORCEオプションなしでビューを作成する必要があります。

- 列名については、OracleはMicrosoft Accessよりも厳密です。列名が重複すると、エラー(「ORA-00957: 列名が重複しています。」)が発生します。この問題を回避するには、重複する列名のいずれかに別名を追加します。

表3-4に、問合せの移行時に、Microsoft Access固有の機能がどのようにOracleモデルに変換されるかを示します。

表3-4 問合せの移行時におけるMicrosoft Access機能の変換

Microsoft Accessの機能

Oracleの機能への変換

DISTINCTROW

DISTINCT。警告: DISTINCTROWはすべてのレコード・データに基づいて重複レコードを削除しますが、DISTINCTは選択したデータにのみ基づいて重複行を削除します。DISTINCTROWと同様の動作を行うには、(必要な一意性のレベルを保証するために)さらに列を選択する必要がある場合があります。

日付への参照(#文字を使用)

単純な日付マスクに基づいた日付。これがデータに合わない場合は、Oracleモデルのユーティリティ・パッケージでVARCHAR2TODATE日付変換ファンクションを変更する必要があります。

Microsoft Accessの問合せにパラメータを使用せず、Microsoft Accessのリンクした表としてアクセスできるOracleのビューに変換する場合、次の手順に従います。

1. Oracle ODBCドライバを使用してデータソース名(DSN)を作成します。

2. Microsoft Accessでデータベースをオープンして、「Insert」→「Table」を選択します。

3. ポップアップ・ウィンドウで、「Link Table」を選択します。

4. 「Files of Type」ダイアログ・ボックスで、「ODBC Databases」を選択します。

5. 手順1で作成したDSNを選択します。

6. logon_name.viewnameを選択します。Microsoft Accessのアプリケーションが、実行時にユーザーにパスワードを求めるプロンプトを表示する必要がないように、「Save Password」を選択することも可能です。

7. 一意の識別子を指定します。

3.5.1 パラメータを使用するMicrosoft Accessの問合せ

パラメータを使用するMicrosoft Accessの問合せは、同一セッションで設定したパラメータを持つ必要があるOracleのビューに変換されます。パラメータはセッションごとの変数に格納され、パラメータの取得と設定に、それぞれgetメソッドおよびsetメソッドを使用してアクセスされます。次の例では、input_nameパラメータを、移行した問合せqueryexampleのSmithに設定します。

omwb_emulation.utilities.setvarchar2('QUERYEXAMPLE:input_name','Smith');

次の例では、current_dateパラメータを、移行した問合せqueryexampleの現在のシステム日付(OracleではSYSDATE)に設定します。

omwb_emulation.utilities.setdata('QUERYEXAMPLE:current_date',SYSDATE);

必要な書式でデータを表示するには、omwb_emulation.utilities.varchar2todateファンクションの書式文字列を変更する必要がある場合があります。

該当するgetメソッドは、移行した問合せにすでに含まれています。次に例を示します。

SELECT omwb_emulation.utilities.getvarchar2('QUERYEXAMPLE:input_name') FROM dual
SELECT omwb_emulation.utilities.getdate('QUERYEXAMPLE:current_date') FROM dual

パラメータ文字列の最大値はデフォルトで256に設定されています。

次の例では、同一セッションのパラメータを設定します。Microsoft Accessの問合せは、次のとおりです。

Parameters [input name] text;
select telephone from example1 where name=[input name];

生成されたOracleのビューは、次のとおりです。

CREATE OR REPLACE FORCE VIEW queryexample  AS
SELECT  telephone
FROM example1 WHERE name =
(SELECT omwb_emulation.utilities.getvarchar2('QUERYEXAMPLE:input_name')
FROM dual)

前述の例の場合、次の文でパラメータを設定する必要があります。

omwb_emulation.utilities.setvarchar2('QUERYEXAMPLE:input_name','Smith');

パラメータを設定すると、ビューの問合せができます。次に例を示します。

SELECT * FROM queryexample;

次の例では、オープンした接続でパラメータを設定します。これはADOコードおよびMSDASQL(Microsoft OLE driver for ODBC)とOracle ODBCを使用することを想定しています。詳細は、Microsoft Knowledge BaseのID 281998の項目を参照してください。

Declarations:
Dim con As ADODB.Connection
Dim setstring As ADODB.Command
Dim param1 As ADODB.Parameter
Dim param2 As ADODB.Parameter

Code to set parameter over connection con:

Set setstring = New ADODB.Command
With setstring
.ActiveConnection = con
.CommandText = "omwb_emulation.utilities.setvarchar2"
.CommandType = adCmdStoredProc
End With

Set param1 = setstring.CreateParameter(, adVarChar, adParamInput, 100, "QUERYEXAMPLE:input_name")
setstring.Parameters.Append param1

Set param2 = setstring.CreateParameter(, adVarChar, adParamInput, 100, "Smith")
setstring.Parameters.Append param2

setstring.Execute
Set setstring = Nothing

このコードの実行後に、この接続でこの項の前半の問合せ(SELECT * FROM queryexample;)を実行し、結果セットを使用できます。

3.6 ピボット・テーブルを作成するMicrosoft AccessのTRANSFORM文

ピボット・テーブルを作成する単純なMicrosoft AccessのTRANSFORM文のみが移行されます。たとえば、次のような書式のMicrosoft Accessの文があるとします。

TRANSFORM grp_function(value)
SELECT a,b,c
FROM xxxx
WHERE yyyy
GROUP BY zzzz
PIVOT pivot_exp in (val1,val2,val3)

この文は、Oracleモデルの次の書式の文に変換されます。

SELECT a,b,c,
grp_function(decode(pivot_exp,val1,value,null)),
grp_function(decode(pivot_exp,val2,value,null)),
grp_function(decode(pivot_exp,val3,value,null))
FROM xxxx
WHERE yyyy
GROUP BY zzzz

変換された文では、decode行はcase decode(pivot_exp,val1,value,null) is if pivot_exp is equal to val1 return value else return nullと同様です。

GROUP BYは、Oracle DatabaseではORDER BYを使用する必要がある場合があります。

Oracleでは列を定義する必要があるため、動的問合せの作成に必要なデータによって列の数が異なる場合、SQL Developerは必要な列を判断できません。列の型と数が事前にわからない場合は、REFカーソルを使用する必要があることがあります。

4 トラブルシューティング

この章では、Microsoft AccessデータベースからOracleへの変換時に必要となる可能性があるトラブルシューティングでの解決方法を説明します。

この章の内容は次のとおりです。

- 4.1 Microsoft Accessセキュリティの解除

- 4.2 問合せによるリレーションの移行

- 4.3 表に対する主キーの定義

- 4.4 Microsoft Access ODBCデータソースを使用した表データの移行

- 4.5 データ移行時の不適切なブール値

- 4.6 Microsoft Accessデータベースの変更時のエラー

4.1 Microsoft Accessセキュリティの解除

SQL Developerでは、セキュリティが有効になっているMicrosoft Accessデータベースの移行はサポートされていません。SQL Developerを使用してMicrosoft Accessの表データを移行するには、保護されたデータベースの内容を新しいデータベースにコピーする必要があります。すべての内容(セキュリティ設定を除く)を新しいデータベースにコピーします。その後、その新しいデータベースをOracleに移行します。

保護されたデータベースの内容を新しいデータベースにコピーするには、次の手順を実行します。

1. Microsoft Accessで、「File」→「New Database」を選択します。

2. 「Blank Database」アイコンを選択し、「OK」をクリックします。

3. 「File New Database」ダイアログ・ボックスで、データベースの名前を入力し、「Create」をクリックします。

4. 新しいデータベース内で、「File」→「Get External Data」→「Import」を選択します。

5. インポート対象の保護されたMicrosoft Accessデータベースを選択し、「Import」をクリックします。

6. 「Import Objects」ダイアログ・ボックスで、「Options」をクリックします。「Relationships」オプションおよび「Definition and Data」オプションが選択されていることを確認します。

7. 「Tables」タブで、「Select All」を選択します。

8. 「OK」をクリックします。

4.2 問合せによるリレーションの移行

現在、SQL Developerでは、問合せで構成されるリレーションの移行はサポートされていません。Microsoft AccessデータベースをOracleに移行する際のエラーを回避するには、次の手順を実行して、リレーションを手動で削除します。

1. Microsoft Accessデータベース内で、「Tools」→「Relationships」を選択します。

2. リレーションシップを示す結合線を右クリックして、「Delete」を選択します。

3. 「Yes」を選択して、削除を確定します。

4. Microsoft AccessデータベースをOracleに移行します。

4.3 表に対する主キーの定義

指定した表に主キーまたは一意索引が定義されていない場合は、移行後にその表のレコードを更新することができません。Microsoft Jetデータベース・エンジンでOracle内の表に対するダイナセットをサポートするには、その表に主キーまたは一意索引が必要です。Oracleの表に主キーまたは一意索引が定義されていない場合、Microsoft Jetデータベース・エンジンはその表の編集不可能なスナップショットのみをオープンします。Microsoft Jetデータベース・エンジンを使用して表の内容を更新するには、次のいずれかの操作を行う必要があります。

- 元のMicrosoft Accessの表に主キーまたは一意索引を定義します。Microsoft Accessデータベースを再度取得して、主キーまたは一意索引がOracleの表に適用されるようにします。

- SQL Developerを使用してMicrosoft Accessデータベースを変更する前に、移行したOracleの表に主キーまたは一意索引を定義します。たとえば、次の構文を使用して主キーを定義します。

alter table <user>.<table> add ( constraint <primary key name> primary key ( <column name> ));

ここで、変数userをScott、tableをCategories、primary key nameをPK_CATEGORIES、column nameをIDに置き換えると、構文は次のようになります。

ALTER TABLE Scott.Categories ADD ( CONSTRAINT PK_CATEGORIES PRIMARY KEY
( ID ) );

4.4 Microsoft Access ODBCデータソースを使用した表データの移行

ODBCデータソースが有効なAccessデータベース・ファイルを参照していない場合、移行プロセスでのデータ移動時に、次のメッセージが表示されます。

The Microsoft Access ODBC Data Source Name "omwb_msaccess" is not configured properly

このメッセージが表示された場合、次の手順を実行します。

1. 「スタート」→「設定」→「コントロール パネル」を選択します。

2. 「データ ソース(ODBC)」を選択します。

3. 「ユーザー DSN」タブでomwb_msaccessを選択します。

4. 「構成」をクリックします。

5. 「データベース」セクションの「選択」をクリックします。

6. 移行するデータベースを参照して、「OK」をクリックします。

4.5 データ移行時の不適切なブール値

SQL Developerでブール値データを取得する場合、Microsoft Access ODBCドライバによって0(FALSEの場合)または1(TRUEの場合)のいずれかの値が戻されます。そのため、OracleでもFALSEとTRUEの値は0と1で表されます。

ただし、このデータをMicrosoft VBアプリケーションで使用すると、問題が発生する可能性があります。Microsoft VBでは、内部的にTRUEが(1ではなく)-1、FALSEが0で表されます。そのため、TRUEに基づいた評価を行うと、プログラムが論理的に誤った動作を行う場合があります。

プログラム・ロジックが変更されないように、次のコマンドを実行して、Oracle表のTRUEブール値を更新することをお薦めします。

UPDATE <TABLENAME> SET <COLUMNNAME> = -1 WHERE <COLUMNAME> = 1

4.6 Microsoft Accessデータベースの変更時のエラー

Microsoft Accessデータベースの変更中、次のエラー・メッセージが表示される場合があります。

Error 3051

The Microsoft Access database cannot open the file name.It is already opened exclusively by another user or you need permission to view its data.

解決方法

Microsoft Accessデータベースに対する書込み権限を取得してください。

Error 3111

Couldn't create; no modify design permission for table or query name.

解決方法

Microsoft Accessデータベースに適切な権限を設定してください。データベースの所有者でない場合は、この操作を実行できない場合があります。この場合は、データベースのコピーを作成してください。

データベースのコピーを作成するには、次の手順を実行します。

1. Microsoft Accessに新しいデータベースを作成します。

2. 「File」メニューから、「Get External Data」、続いて「Import」を選択します。

3. 元のデータベースを選択します。

4. すべてのスキーマ・オブジェクトを選択した後、「OK」を選択します。

5. スキーマ・オブジェクトを新しいデータベースにコピーします。これで、新しく作成したMicrosoft Accessデータベースに適切な権限が付与されます。

注意:
Microsoft Accessデータベースで表を(ダイナセットまたはスナップショットを使用しないで)直接オープンすると、リンクされた表は使用できません。この制限は、データをOracleに移動した後も適用されます。この問題を解決するには、ダイナセットまたはスナップショットを使用するようにアプリケーションを変更します。

5 アプリケーションのパフォーマンス・チューニング

この章では、OracleとMicrosoft Accessを連携させる場合のチューニングおよびカスタマイズについて説明します。

この章の内容は次のとおりです。

- 5.1 ODBCドライバの選択

- 5.2 サーバーベースのパラメータ表の使用

- 5.3 アプリケーションの起動パフォーマンスの改善

- 5.4 Microsoft Jetデータベース・エンジンの動作の高速化

- 5.5 Microsoft Jetデータベース・エンジンの排除

5.1 ODBCドライバの選択

Oracleでは、多くのODBCドライバを使用できます。オラクル社が提供するドライバに加えて、Microsoft社、Visigenic社、MERANT社などのドライバを使用できます。

ODBCドライバによってパフォーマンスが異なる場合があります。大規模なアプリケーションを構築する場合は、そのアプリケーションに様々なODBCドライバのプロファイルを設定する必要があります。パフォーマンスを判断する最適な方法は、ODBCまたはOCIスパイ・プログラムを使用することです。これらのプログラムを使用すると、Microsoft Jetデータベース・エンジンからODBC APIへのコールが示されます。また、Oracle ODBCドライバからOCIへのコールも示されます。

5.2 サーバーベースのパラメータ表の使用

フロント・エンドにMicrosoft Accessを使用するOracle Databaseを管理する場合は、MSysConfという専用のパラメータ表をOracle Databaseに作成し、Microsoft AccessアプリケーションとOracle Database間の通信を制御できます。Microsoft AccessからOracle Databaseへ初めて接続が行われる際、接続するOracleユーザー・スキーマにMSysConf表が存在するかどうかが確認されます。MSysConf表を使用すると、リンクされた表内にユーザー・ログオン情報を格納しないようにできるため、アプリケーションのセキュリティが向上します。また、MSysConf表を使用して、レコード検索機能を最適化できます。次の表に、Oracle内のMSysConf表の構造を示します。

列

データ型

Config

NUMBER(10)

chValue

VARCHAR2(255)

nValue

NUMBER(10)

Comments

VARCHAR2(255)

次の表に、Config列およびnValue列の値を示します。これらの値を使用して、Microsoft AccessとOracleを連携させる方法をカスタマイズできます。

Config

nValue

説明

101

0

ユーザーが、リンクされた表にUSERIDおよびPASSWORDを格納することを禁止します。

101

1

ユーザーが、リンクされた表にUSERIDおよびPASSWORDを格納することを許可します(デフォルト)。

102

D

検索と検索の間をD秒遅延させます。

103

N

各検索でN行フェッチします。

デフォルト設定を使用する場合でも、各Oracle DatabaseにMSysConf表を作成することをお薦めします。これによって、後でMSysConf表の値を変更するために、この表を作成して名前を付ける方法を覚えておく必要がなくなります。

5.3 アプリケーションの起動パフォーマンスの改善

Microsoft Accessをチューニングして、アプリケーションの起動時にODBC接続を確立する処理を高速化できます。Microsoft AccessがODBCデータベースに接続する際、特定のODBCドライバによって提供される機能のレベルが判断されます。セキュリティにOracleの機能のみを使用している場合、Microsoft Accessのユーザー、グループおよびパスワード情報を使用した、Microsoft AccessによるOracleへのログインをバイパスできます。

ログイン認証をバイパスするかどうかは、TryJetAuth属性の値によって決定されます。TryJetAuth属性のデフォルト値(1)を使用すると、Microsoft Accessは、Microsoft Accessのログイン情報を使用して、Oracle Databaseへの接続を試行します。Microsoft Accessのログイン認証をバイパスするには、TryJetAuth属性を0(ゼロ)に設定する必要があります。これによって、Oracleへの初期接続時間が1から2秒間短縮されます。

Microsoft Access 97およびMicrosoft Access 2000では、レジストリ・エディタ(regedit)を使用してWindowsレジストリを変更します。表5-1に、システムにインストールされたMicrosoft Accessのバージョンに応じたレジストリ・キーの場所を示します。

表5-1 レジストリ・キーの場所

Microsoft Accessのリリース

レジストリ・キーの場所

Microsoft Access 97

HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\3.5\Engines\ODBC

Microsoft Access 2000、2002(XP)および2003

HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines\ODBC

5.4 Microsoft Jetデータベース・エンジンの動作の高速化

Microsoft AccessのフォームおよびレポートがOracle Database内に存在するデータに対して機能するように、SQL Developerは、Microsoft AccessデータベースにODBCリンク表を生成します。このODBCリンク表は、Oracle Database内の表を参照します。Microsoft AccessアプリケーションでODBCリンク表を使用すると、パフォーマンスが低下します。具体的には、一部のODBCデータソース情報をODBCリンク表オブジェクトにキャッシュすることによって接続時間は短縮されますが、ODBCリンク表を使用したDML操作の実行速度は遅くなります。

CurrentDBオブジェクトは、Microsoft Access VBAコード内で、データベース情報を参照するために広範囲に使用されます。移行前は、CurrentDBオブジェクトはローカルのMicrosoft Accessの表を参照します。SQL DeveloperでMicrosoft Accessデータベースを変更した後は、CurrentDBオブジェクトはODBCリンク表を参照します。

Microsoft Jetデータベース・エンジンでのODBCデータソースの操作を高速化するには、ODBCリンク表が可能なかぎり直接使用されないようにする必要があります。これを行う方法の1つは、VBAコード内で、CurrentDBオブジェクトのかわりにJetワークスペースのDatabaseオブジェクトを使用することです。Databaseオブジェクトは、ODBCリンク表を参照しません。かわりに、このオブジェクトでは、Oracle表への直接接続が必要です。

CurrentDBオブジェクトとDatabaseオブジェクトの両方で公開されているプロパティおよびメソッドは同じであるため、VBAコードで必要な変更は最小限で済みます。

CurrentDBオブジェクト参照をDatabaseオブジェクト参照に置き換えるには、次の手順を実行します。

1. Database型のグローバル変数を作成します。次に例を示します。

Global dbOracle As Database

1. 次に示すように、初期化中にOracle Databaseへの接続を作成して、Databaseオブジェクトを作成します。

Dim dsn As String
Dim uid As String
Dim pwd As String
Dim odbcConnectStr As String

dsn = "ora817"
uid = "system"
pwd = "manager"

' build up the connect string
odbcConnectStr = "ODBC;DSN=" & dsn & ";UID=" & uid & ";PWD=" & pwd

' use Microsoft JET Workspace to make a connection to the Oracle database
Set dbOracle = DBEngine.Workspaces(0).OpenDatabase(dsn,_
dbDriverCompleteRequired, False, odbcConnectStr)

1. CurrentDBに対するすべての参照をdbOracleに対する参照に置き換えます。

注意:
Databaseオブジェクトは直接Oracle表を参照するため、表を操作する際には、Microsoft Accessの表名ではなくOracleの表名を指定することが重要です。Microsoft AccessデータベースとOracle Databaseで適用されるオブジェクトのネーミング制限が異なるため、両方のデータベースで異なる表名を使用できます。

Microsoft AccessからODBCリンク表を削除することはできません。VBAコードでODBCリンク表が参照されなくなっても、データベース内のフォームおよびレポートは、ODBCリンク表を直接参照しているためです。ODBCリンク表を参照しないようにフォームおよびレポートを変更するには、煩雑な作業を行う必要があります。すべてのレコード・ナビゲーションおよびレコード操作の再プログラミングに加えて、フォームおよびレポートの再コーディングが必要です。これらの変更を行っても、Microsoft Jetデータベース・エンジンはバイパスされません。Microsoft Jetデータベース・エンジンは引き続き使用されるため、Oracle Databaseからレコードを取得する際に全表スキャンが実行されます。Microsoft Jetデータベース・エンジンのボトルネックを取り除く方法については、「Microsoft Jetデータベース・エンジンの排除」を参照してください。

5.5 Microsoft Jetデータベース・エンジンの排除

ODBCデータソースを使用するMicrosoft Accessアプリケーションのパフォーマンスが大幅に低下する主な原因は、Microsoft Jetデータベース・エンジンです。Microsoft Jetデータベース・エンジンには、表の問合せが実行されるたびに全表スキャンが実行されるという問題があります。そのため、Microsoft AccessのフォームまたはレポートがODBCリンクを介してOracle表を参照する場合、Microsoft Jetデータベース・エンジンは、問合せの実行前に、表のすべての内容をローカル・メモリーに取得する必要があります。多くの場合、Microsoft Jetデータベース・エンジンを排除すると、元のMicrosoft Accessアプリケーションより高速になります。

Microsoft Jetデータベース・エンジンのかわりに、ODBCDirectを使用することもできます。ODBCDirectでは、移行先Oracle Databaseへの接続のみを表すConnectionオブジェクトが使用されます。ODBCDirectを使用する場合、Microsoft Jetデータベース・エンジンはロードされません。ODBCDirectを使用すると、すべてのSQL文は、変更されずにOracleサーバーに送信されて操作されます。SQL文はOracleサーバーで評価および解析されるため、ネットワーク通信量は大幅に減少します。問い合されたレコード情報のサブセットのみが、ネットワークを介してMicrosoft Accessアプリケーションに戻されます。

ODBCDirect Connectionオブジェクトを使用するようにVBAコードを変更する手順は複雑です。Connectionオブジェクトと、CurrentDBおよびDatabaseオブジェクトでは、使用されるプロパティおよびメソッドが大きく異なります。また、SQL文はネットワークを介してOracleサーバーに送信されて操作されるため、正しいOracle構文でSQL文を記述する必要があります。そのため、次の操作の実行を検討する必要があります。

- Oracle SQL構文に準拠するように、VBAコード内のすべてのSQL文を変更します。

- Microsoft Access固有の式を含むSQL文をOracleの構文に変更します。

- SQL文で使用されているMicrosoft Accessの組込み関数を、Oracleの同等のファンクションに置き換えます。

CurrentDB or Databaseオブジェクト参照をConnectionオブジェクト参照に置き換えるには、次の手順を実行します。

1. グローバルODBCDirect Connectionオブジェクト参照を次のように作成します。

Global connOracle as Connection

2. ODBCDirectワークスペースを次のように作成します。

Dim DSN As String
Dim UID As String
Dim PWD AS String

DSN = "ora817"
UID = "system"
PWD = "manager"

wsODBC = DBEngine.CreateWorkspace(DSN, UID, PWD, dbUseODBC)

1. 次に示すように、Oracle Databaseに接続して、ODBCDirect Connectionオブジェクトを作成します。

Dim ODBCconnectStr AS String

' build up the connect string
ODBCconnectStr = "ODBC;DSN=" & DSN & ";UID=" & UID & ";PWD=" & PWD

' open a connection to the Oracle database
Set connOracle = wsODBC.OpenConnection(DSN, dbDriverCompleteRequired, False, ODBCconnectStr)

1. Oracle Databaseでデータを操作するには、次に示すように、SQLコマンドをOracleサーバーに直接渡して処理します。

Dim sql As String
set sql = "select * from emp where empno > 10"
connOracle.execute sql

5.5.1 条件および制限付きの問合せ

必要な列のみを表に問い合せることによって、ネットワーク通信量を削減できます。また、可能なかぎり最も厳しい条件を使用して、問合せの結果セットのサイズを削減する必要があります。

5.5.2 スナップショットとダイナセット

可能であれば、Oracleデータの操作では順方向スナップショットを使用します(特に結果セットが小規模な場合)。大規模な結果セットおよび更新する必要がある問合せの場合、ダイナセットを使用します。データを更新しない場合でも、大規模な結果セットでは、ダイナセットの方がスナップショットより高速です。

5.5.3 ドロップダウン・リストの使用方法の比較

ドロップダウン・リスト・オプションに項目を移入する必要がある場合、Microsoft Accessでは、ネットワーク通信量ができるかぎり少なくなる方法が試行されます。スナップショットを使用してドロップダウン・リストを移入すると、Microsoft Accessでは、グリッドまたはフォームの移入に使用するときと同じ、レコード・フェッチのバッチを使用します。Microsoft Accessは、最初にデータのチャンク(100行)をフェッチして、その後定期的にサーバーから100行のセットを取得します。

この処理は、フェッチ済の行に一致しないエントリを指定した場合を除き、適切に動作します。このようなエントリを指定した場合、Microsoft Accessは、一致する行が検出されるか、またはすべてのレコードが取得されるまで、サーバーからレコードをフェッチします。大規模なセットが戻される場合、この手順には時間がかかる場合があります。また、ユーザー・インタフェースで問題が発生する場合もあります。

Microsoft Accessでは、ドロップダウン・リストの問合せは共有されません。スナップショットの問合せは、複数のリスト・ボックス間で再利用できません。かわりに、Microsoft Accessは、実行される各問合せを個別に処理します。

小さいドロップダウン・リスト(レコード数が100未満の場合など)では、多くの場合、Microsoft Accessの通常の操作で問題ありません。大きいリストでは、同期化されたシャドウ表をMicrosoft Accessに構築すると有効な場合があります。表の情報をMicrosoft Accessにローカルに格納し、ローカル表をOracleの情報と定期的に同期化します。

A Microsoft Accessのエラー・メッセージ

この付録では、Microsoft Jetデータベース・エンジンで戻されるエラー番号およびエラー・メッセージのリストを示します。また、各エラーが属するクラスも示します。この章の内容は次のとおりです。

- A-1 エラー・メッセージのクラス

- A.2 Microsoft Jetデータベース・エンジンのエラー・メッセージ

A.1 エラー・メッセージのクラス

表A-1に、Microsoft Jetデータベース・エンジンのエラー・メッセージが属するクラスを示します。

表A-1 エラー・メッセージのクラス

クラス

説明

BTRIEVE

BTRIEVEのインストール可能なISAM固有のエラー(Microsoft Jet 2.5以前)。

DAO

DAO固有のエラー。

DBASE

dBASEのインストール可能なISAM固有のエラー。

DDL

データ定義言語固有のエラー。

EXCEL

Microsoft Excelのインストール可能なISAM固有のエラー。

EXTENDED

追加のエラー情報が含まれる可能性があるエラー。

IMEX

一般的なインポート/エクスポートのエラー。

INST ISAM

一般的なインストール可能なISAMエラー。

INTERNET

インターネット固有のエラー。

ISAM

一般的なMicrosoft Jet ISAMのエラー。

JPM

プロパティ管理に関するMicrosoft Jetデータベース・エンジンのエラー。

MISC

他のカテゴリに適合しないMicrosoft Jetデータベース・エンジンのエラー。

PARADOX

Paradoxのインストール可能なISAM固有のエラー。

PARSE

Microsoft Jetデータベース・エンジンの式解析エラー。

QUERY

問合せに関するMicrosoft Jetデータベース・エンジンのエラー。

REF INTEGRITY

参照整合性に関するMicrosoft Jetデータベース・エンジンのエラー。

REMOTE

ODBC固有のMicrosoft Jetデータベース・エンジンのエラー。

REPLICATOR

レプリケーションに関するMicrosoft Jetデータベース・エンジンのエラー。

SECURITY

セキュリティに関するMicrosoft Jetデータベース・エンジンのエラー。

TEXT

テキストのインストール可能なISAM固有のエラー。

TLV

表レベルの検証エラー。

UNUSED

使用されていない、または特別な意味を持つMicrosoft Jetデータベース・エンジンのエラー。通常、特別な意味を持つエラーとは、他のエラーから変換されたものであり、Microsoft Jetデータベース・エンジンのコードで生成されたものではありません。

A.2 Microsoft Jetデータベース・エンジンのエラー・メッセージ

表A-2に、Microsoft Jetデータベース・エンジンのエラー・メッセージを示します。アスタリスク(*)は、Microsoft Jetのエラー・メッセージ・テキストがないことを意味します。山カッコで囲まれたイタリック体の項目(<name>など)は、エラー・メッセージが表示されるときに与えられる値のプレースホルダを表します。

表A-2 Microsoft Jetデータベース・エンジンのエラー・メッセージ

エラー番号

エラー・メッセージ

クラス

2420

Syntax error in number.

PARSE

2421

Syntax error in date.

PARSE

2422

Syntax error in string.

PARSE

2423

Invalid use of '.', '!', or '()'.

PARSE

2424

Unknown name.

PARSE

2425

Unknown function name.

PARSE

2426

Function isn't available in expressions.

PARSE

2427

Object has no value.

PARSE

2428

Invalid arguments used with domain function.

PARSE

2429

In Operator without ().

PARSE

2430

Between operator without And.

PARSE

2431

Syntax error (missing operator).

PARSE

2432

Syntax error (comma).

PARSE

2433

Syntax error.

PARSE

2434

Syntax error (missing operator).

PARSE

2435

Extra ).

PARSE

2436

Missing ), ], or Item.

PARSE

2437

Invalid use of vertical bars.

PARSE

2438

Syntax error.

PARSE

2439

Wrong number of arguments with function.

PARSE

2440

IIf function without ().

PARSE

2442

Invalid use of parentheses.

PARSE

2443

Invalid use of Is operator.

PARSE

2445

Expression too complex.

PARSE

2446

Out of memory during calculation.

PARSE

2447

Invalid use of '.', '!', or '()'.

PARSE

2448

Can't set value.

PARSE

3000

Reserved error <item>; there is no message for this error.

UNUSED

3001

Invalid argument.

MISC

3002

Couldn't start session.

ISAM

3003

Couldn't start transaction; too many transactions already nested.

ISAM

3004*

UNUSED

3005

<Database name> isn't a valid database name.

ISAM

3006

Database <name> is exclusively locked.

ISAM

3007

Can't open library database <name>.

ISAM

3008

The table <name> is already opened exclusively by another user, or it is already open through the user interface and cannot be manipulated programmatically.

ISAM

3009

You tried to lock table <name> while opening it, but the table can't be locked because it is currently in use.Wait a moment, and then try the operation again.

ISAM

3010

Table <name> already exists.

MISC

3011

The Microsoft Jet database engine could not find the object <name>.Make sure the object exists and that you spell its name and the path name correctly.

MISC

3012

Object <name> already exists.

ISAM

3013

Couldn't rename installable ISAM file.

ISAM

3014

Can't open any more tables.

ISAM

3015

<Index name> isn't an index in this table.Look in the Indexes collection of the TableDef object to determine the valid index names.

ISAM

3016

Field won't fit in record.

ISAM

3017

The size of a field is too long.

MISC

3018

Couldn't find field <name>.

MISC

3019

Operation invalid without a current index.

ISAM

3020

You tried to call Update or CancelUpdate or attempted to update a Field in a recordset without first calling AddNew or Edit.

MISC

3021

No current record.

MISC

3022

The changes you requested to the table were not successful because they would create duplicate values in the index, primary key, or relationship.Change the data in the field or fields that contain duplicate data, remove the index, or redefine the index to permit duplicate values and try again.

ISAM

3023

AddNew or Edit already used.

QUERY

3024

Couldn't find file <name>.

MISC

3025

Can't open any more files.

ISAM

3026

Not enough space on disk.

ISAM

3027

Can't update.Database or object is read-only.

MISC

3028

Can't start the application.The workgroup information file is missing or opened exclusively by another user.

ISAM

3029

Not a valid account name or password.

SECURITY

3030

<Account name> isn't a valid account name.

SECURITY

3031

Not a valid password.

SECURITY

3032

Can't perform this operation.

SECURITY

3033

You don't have the necessary permissions to use the <name> object.Have the system administrator of the person who created this object establish the appropriate permissions for you.

MISC

3034

You tried to commit or roll back a transaction without first using BeginTrans.

ISAM

3035*

3036

Database has reached maximum size.

ISAM

3037

Can't open any more tables or queries.

MISC

3038*

3039

Couldn't create index; too many indexes already defined.

ISAM

3040

Disk I/O error during read.

ISAM

3041

Can't open a database created with a previous version of the application.

ISAM

3042

Out of MS-DOS file handles.

ISAM

3043

Disk or network error.

UNUSED

3044

<Path name> isn't a valid path.Make sure that the path name is spelled correctly and that you are connected to the server where the file resides.

ISAM

3045

Couldn't use <file name>; file already in use.

ISAM

3046

Couldn't save; currently locked by another user.

ISAM

3047

Record is too large.

ISAM

3048

Can't open any more databases.

ISAM

3049

Can't open database <name>.It may not be a database that the application recognizes, or the file may be corrupt.

MISC

3050

Couldn't lock file.

ISAM

3051

The Microsoft Jet database engine cannot open the file <name>.It is already opened exclusively by another user, or you need permission to view its data.

MISC

3052

MS-DOS file sharing lock count exceeded.You need to increase the number of locks installed with Share.exe.

ISAM

3053

Too many client tasks.

MISC

3054

Too many MEMO or OLE Object fields.

UNUSED

3055

Not a valid file name.

MISC

3056

Couldn't repair this database.

MISC

3057

Operation not supported on linked tables.

MISC

3058

Index or primary key can't contain a NULL value.

ISAM

3059

Operation canceled by user.

MISC

3060

Wrong data type for parameter <parameter>.

QUERY

3061

Too few parameters.Expected <number>.

EXTENDED

3062

Duplicate output alias <name>.

EXTENDED

3063

Duplicate output destination <field name>.

EXTENDED

3064

Can't open action query <name>.

QUERY

3065

Can't execute a select query.

QUERY

3066

Query must have at least one destination field.

EXTENDED

3067

Query input must contain at least one table or query.

EXTENDED

3068

Not a valid alias name.

QUERY

3069

The action query <name> cannot be used as a row source.

EXTENDED

3070

The Microsoft Jet database engine does not recognize <name> as a valid field name or expression.

QUERY

3071

This expression is typed incorrectly, or it is too complex to be evaluated.For example, a numeric expression may contain too many complicated elements.Try simplifying the expression by assigning parts of the expression to variables.

QUERY

3072

<Visual Basic error string>.

EXTENDED

3073

Operation must use an updateable query.

QUERY

3074

Can't repeat table name <name> in FROM clause.

EXTENDED

3075

<Message> in query expression <expression>.

EXTENDED

3076

<Message> in criteria expression.

EXTENDED

3077

<Message> in expression.

EXTENDED

3078

The Microsoft Jet database engine cannot find the input table or query <name>.Make sure it exists and that its name is spelled correctly.

EXTENDED

3079

The specified field <field name> could refer to more than one table listed in the FROM clause of the SQL statement.

EXTENDED

3080

Joined table <name> not listed in FROM clause.

EXTENDED

3081

Can't join more than one table with the same name <name>.

EXTENDED

3082

JOIN operation <operation> refers to a field that isn't in one of the joined tables.

EXTENDED

3083

Can't use internal report query.

QUERY

3084

Can't insert data with action query.

QUERY

3085

Undefined function <name> in expression.

EXTENDED

3086

Couldn't delete from specified tables.

QUERY

3087

Too many expressions in GROUP BY clause.

QUERY

3088

Too many expressions in ORDER BY clause.

QUERY

3089

Too many expressions in DISTINCT clause.

QUERY

3090

Resultant table not allowed to have more than one AutoNumber field.

ISAM

3091

HAVING clause <clause> without grouping or aggregation.

UNUSED

3092

Can't use HAVING clause in TRANSFORM statement.

EXTENDED

3093

ORDER BY clause <clause> conflicts with DISTINCT.

EXTENDED

3094

ORDER BY clause <clause> conflicts with GROUP BY clause.

EXTENDED

3095

Can't have aggregate function in expression <expression>.

EXTENDED

3096

Can't have aggregate function in WHERE clause <clause>.

EXTENDED

3097

Can't have aggregate function in ORDER BY clause <clause>.

EXTENDED

3098

Can't have aggregate function in GROUP BY clause <clause>.

EXTENDED

3099

Can't have aggregate function in JOIN operation <operation>.

EXTENDED

3100

Can't set field <name> in join key to Null.

EXTENDED

3101

The Microsoft Jet database engine can't find a record in the table <table name> with key matching field(s) <field name>.

EXTENDED

3102

Circular reference caused by <query reference>.

EXTENDED

3103

Circular reference caused by alias <name> in query definition's SELECT list.

EXTENDED

3104

Can't specify fixed column heading <value> in a crosstab query more than once.

EXTENDED

3105

Missing destination field name in SELECT INTO statement <statement>.

EXTENDED

3106

Missing destination field name in UPDATE statement <statement>.

EXTENDED

3107

Record(s) can't be added; no insert permission on <name>.

EXTENDED

3108

Record(s) can't be edited; no update permission on <name>.

EXTENDED

3109

Record(s) can't be deleted; no delete permission on <name>.

EXTENDED

3110

Couldn't read definitions; no read definitions permission for table or query <name>.

EXTENDED

3111

Couldn't create; no modify design permission for table or query <name>.

EXTENDED

3112

Record(s) can't be read; no read permission on <name>.

EXTENDED

3113

Can't update <field name>; field not updateable.

UNUSED

3114

Can't include MEMO or OLE Object when you select unique values <statement>.

EXTENDED

3115

Can't have MEMO or OLE Object fields in aggregate argument <statement>.

EXTENDED

3116

Can't have MEMO or OLE Object fields in criteria <statement> for aggregate function.

EXTENDED

3117

Can't sort on MEMO or OLE Object <clause>.

EXTENDED

3118

Can't join on MEMO or OLE Object <name>.

EXTENDED

3119

Can't group on MEMO or OLE Object <clause>.

EXTENDED

3120

Can't group on fields selected with '*' <table name>.

EXTENDED

3121

Can't group on fields selected with '*'.

EXTENDED

3122

You tried to execute a query that doesn't include the specified expression <name> as part of an aggregate function.

EXTENDED

3123

Can't use '*' in crosstab query.

EXTENDED

3124

Can't input from internal report query <name>.

QUERY

3125

The database engine can't find <name>.Make sure it is a valid parameter or alias name, that it doesn't include characters or punctuation, and that the name isn't too long.

MISC

3126

Invalid bracketing of name <name>.

EXTENDED

3127

The INSERT INTO statement contains the following unknown field name: <field name>.Make sure you've typed the name correctly, and try the operation again.

EXTENDED

3128

Specify the table containing the records you want to delete.

QUERY

3129

Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

QUERY

3130

Syntax error in DELETE statement.

QUERY

3131

Syntax error in FROM clause.

QUERY

3132

Syntax error in GROUP BY clause.

QUERY

3133

Syntax error in HAVING clause.

QUERY

3134

Syntax error in INSERT INTO statement.

QUERY

3135

Syntax error in JOIN operation.

QUERY

3136

The LEVEL clause includes a reserved word or argument that is misspelled or missing, or the punctuation is incorrect.

QUERY

3137

Missing semicolon (;) at end of SQL statement.

QUERY

3138

Syntax error in ORDER BY clause.

QUERY

3139

Syntax error in PARAMETER clause.

QUERY

3140

Syntax error in PROCEDURE clause.

QUERY

3141

The SELECT statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation is incorrect.

QUERY

3142

Characters found after end of SQL statement.

QUERY

3143

Syntax error in TRANSFORM statement.

QUERY

3144

Syntax error in UPDATE statement.

QUERY

3145

Syntax error in WHERE clause.

QUERY

3146

ODBC - call failed.

UNUSED

3147

*

UNUSED

3148

*

UNUSED

3149

*

UNUSED

3150

*

UNUSED

3151

ODBC - connection to <name> failed.

EXTENDED

3152

*

UNUSED

3153

*

UNUSED

3154

ODBC - couldn't find DLL <name>.

REMOTE

3155

ODBC - insert on a linked table <name> failed.

EXTENDED

3156

ODBC - delete on a linked table <name> failed.

EXTENDED

3157

ODBC - update on a linked table <name> failed.

EXTENDED

3158

Couldn't save record; currently locked by another user.

INST ISAM

3159

Not a valid bookmark.

MISC

3160

Table isn't open.

INST ISAM

3161

Couldn't decrypt file.

INST ISAM

3162

You tried to assign the Null value to a variable that isn't a Variant data type.

MISC

3163

The field is too small to accept the amount of data you attempted to add.Try inserting or pasting less data.

MISC

3164

The field can't be updated because another user or process has locked the corresponding record or table.

MISC

3165

Couldn't open .inf file.

DBASE

3166

Cannot locate the requested Xbase memo file.

DBASE

3167

Record is deleted.

MISC

3168

Invalid .inf file.

DBASE

3169

The Microsoft Jet database engine could not execute the SQL statement because it contains a field that has an invalid data type.

QUERY

3170

Couldn't find installable ISAM.

UNUSED

3171

Couldn't find network path or user name.

PARADOX

3172

Couldn't open Paradox.net.

UNUSED

3173

Couldn't open table 'MSysAccounts' in the workgroup information file.

SECURITY

3174

Couldn't open table 'MSysGroups' in the workgroup information file.

SECURITY

3175

Date is out of range or is in an invalid format.

INST ISAM

3176

Couldn't open file <name>.

IMEX

3177

Not a valid table name.

IMEX

3178

*

3179

Encountered unexpected end of file.

IMEX

3180

Couldn't write to file <name>.

IMEX

3181

Invalid range.

IMEX

3182

Invalid file format.

IMEX

3183

Not enough space on temporary disk.

ISAM

3184

Couldn't execute query; couldn't find linked table.

EXTENDED

3185

SELECT INTO on a remote database tried to produce too many fields.

EXTENDED

3186

Couldn't save; currently locked by user <name> on machine <name>.

EXTENDED

3187

Couldn't read; currently locked by user <name> on machine <name>.

EXTENDED

3188

Couldn't update; currently locked by another session on this machine.

ISAM

3189

Table <name> is exclusively locked by user <name> on machine <name>.

UNUSED

3190

Too many fields defined.

ISAM

3191

Can't define field more than once.

ISAM

3192

Couldn't find output table <name>.

EXTENDED

3193

(unknown).

UNUSED

3194

(unknown).

UNUSED

3195

(expression).

UNUSED

3196

The database <name> is already in use by another person or process.When the database is available, try the operation again.

ISAM

3197

The Microsoft Jet database engine stopped the process because you and another user are attempting to change the same data at the same time.

MISC

3198

Couldn't start session.Too many sessions already active.

ISAM

3199

Couldn't find reference.

REF INTEGRITY

3200

The record cannot be deleted or changed because table <name> includes related records.

EXTENDED

3201

You can't add or change a record because a related record is required in table <name>.

EXTENDED

3202

Couldn't save; currently locked by another user.

ISAM

3203

Subqueries cannot be used in the expression <expression>.

EXTENDED

3204

Database already exists.

ISAM

3205

Too many crosstab column headers <value>.

EXTENDED

3206

Can't create a relationship between a field and itself.

REF INTEGRITY

3207

Operation not supported on a Paradox table with no primary key.

PARADOX

3208

Invalid deleted setting in the Xbase key of the Windows registry.

DBASE

3209

*

UNUSED

3210

The connection string is too long.

QUERY

3211

The database engine couldn't lock table <name> because it's already in use by another person or process.

EXTENDED

3212

Couldn't lock table <name>; currently in use by user <name> on machine <name>.

UNUSED

3213

Invalid Date setting in the Xbase key of the Windows registry.

DBASE

3214

Invalid Mark setting in the Xbase key of the Windows registry.

DBASE

3215

Too many Btrieve tasks.

BTRIEVE

3216

Parameter <name> specified where a table name is required.

EXTENDED

3217

Parameter <name> specified where a database name is required.

EXTENDED

3218

Couldn't update; currently locked.

ISAM

3219

Invalid operation.

MISC

3220

Incorrect collating sequence.

PARADOX

3221

Invalid settings in the Btrieve key of the Windows registry.

BTRIEVE

3222

Query can't contain a Database parameter.

QUERY

3223

<Parameter name> is invalid because it is too long or contains invalid characters.

EXTENDED

3224

Can't read Btrieve data dictionary.

BTRIEVE

3225

Encountered a record locking deadlock while performing a Btrieve operation.

BTRIEVE

3226

Errors encountered while using the Btrieve DLL.

BTRIEVE

3227

Invalid Century setting in the Xbase key of the Windows registry.

DBASE

3228

Invalid Collating Sequence setting in the Paradox key of the Windows registry.

PARADOX

3229

Btrieve - can't change field.

BTRIEVE

3230

Out-of-date Paradox lock file.

PARADOX

3231

ODBC - field would be too long; data truncated.

REMOTE

3232

ODBC - couldn't create table.

REMOTE

3233

*

UNUSED

3234

ODBC - remote query timeout expired.

REMOTE

3235

ODBC - data type not supported on server.

REMOTE

3236

*

UNUSED

3237

*

UNUSED

3238

ODBC - data out of range.

REMOTE

3239

Too many active users.

ISAM

3240

Btrieve - missing Btrieve engine.

BTRIEVE

3241

Btrieve - out of resources.

BTRIEVE

3242

Invalid reference in SELECT statement.

EXTENDED

3243

None of the import field names match fields in the appended table.

IMEX

3244

Can't import password-protected spreadsheet.

IMEX

3245

Couldn't parse field names from the first row of the import table.

IMEX

3246

Operation not supported in transactions.

MISC

3247

ODBC - linked table definition has changed.

REMOTE

3248

Invalid NetworkAccess setting in the Windows registry.

INST ISAM

3249

Invalid PageTimeout setting in the Windows registry.

INST ISAM

3250

Couldn't build key.

ISAM

3251

Operation is not supported for this type of object.

MISC

3252

Can't open a form whose underlying query contains a user-defined function that attempts to set or get the form's RecordsetClone property.

MISC

3253

*

UNUSED

3254

ODBC - can't lock all records.

REMOTE

3255

*

UNUSED

3256

Index file not found.

DBASE

3257

Syntax error in WITH OWNERACCESS OPTION declaration.

QUERY

3258

The SQL statement couldn't be executed because it contains ambiguous outer joins.To force one of the joins to be performed first, create a separate query that performs the first join and then include that query in the SQL statement.

QUERY

3259

Invalid field data type.

MISC

3260

Couldn't update; currently locked by user <name> on machine <name>.

EXTENDED

3261

Table <name> is exclusively locked by user <name> on machine <name>.

EXTENDED

3262

Couldn't lock table <name>; currently in use by user <name> on machine <name>.

EXTENDED

3263

Invalid database object.

MISC

3264

No field defined - cannot append TableDef or Index.

DAO

3265

Item not found in this collection.

DAO

3266

Can't append a Field that is already a part of a Fields collection.

DAO

3267

Property can be set only when the Field is part of a Recordset object's Fields collection.

DAO

3268

Can't set this property once the object is part of a collection.

DAO

3269

Can't append an Index that is already part of an Indexes collection.

DAO

3270

Property not found.

DAO

3271

Invalid property value.

DAO

3272

Object isn't a collection.

DAO

3273

Method not applicable for this object.

DAO

3274

External table isn't in the expected format.

INST ISAM

3275

Unexpected error from the external database driver <error number>.

INST ISAM

3276

Invalid database object reference.

MISC

3277

Can't have more than 10 fields in an index.

ISAM

3278

The Microsoft Jet database engine has not been initialized.

MISC

3279

The Microsoft Jet database engine has already been initialized.

MISC

3280

Can't delete a field that is part of an index or is need by the system.

ISAM

3281

Can't delete this index or table.It is either the current index or is used in a relationship.

ISAM

3282

Operation is not supported on a table that contains data.

ISAM

3283

Primary key already exists.

ISAM

3284

Index already exists.

ISAM

3285

Invalid index definition.

ISAM

3286

Format of memo file doesn't match specified external database format.

INST ISAM

3287

Can't create index on the given field.

ISAM

3288

Paradox index is not primary.

PARADOX

3289

Syntax error in CONSTRAINT clause.

DDL

3290

Syntax error in CREATE TABLE statement.

DDL

3291

Syntax error in CREATE INDEX statement.

DDL

3292

Syntax error in field definition.

DDL

3293

Syntax error in ALTER TABLE statement.

DDL

3294

Syntax error in DROP INDEX statement.

DDL

3295

Syntax error in DROP TABLE or DROP INDEX.

DDL

3296

Join expression not supported.

MISC

3297

Couldn't import table or query.No records found, or all records contain errors.

IMEX

3298

There are several tables with than name.Please specify owner in the format 'owner.table'.

REMOTE

3299

ODBC Specification Conformance Error <message>.Report this error to the developer of the application.

UNUSED

3300

Can't create a relationship.

REF INTEGRITY

3301

Can't perform this operation; features in this version are not available in databases with older formats.

MISC

3302

Can't change a rule while the rules for this table are in use.

TLV

3303

Can't delete this field.It's part of one or more relationships.

REF INTEGRITY

3304

You must enter a personal identifier (PID) consisting of at least four and no more than 20 characters and digits.

SECURITY

3305

Invalid connection string in pass-through query.

REMOTE

3306

You've written a subquery that can return more than one field without using the EXISTS reserved word in the main query's FROM clause.Revise the SELECT statement of the subquery to request only one field.

QUERY

3307

The number of columns in the two selected tables or queries of a union query don't match.

QUERY

3308

Invalid TOP argument in select query.

EXTENDED

3309

Property setting can't be larger than 2K.

JPM

3310

This property isn't supported for external data sources for databases created with a previous version of Microsoft Jet.

JPM

3311

Property specified already exists.

JPM

3312

Validation rules and default values can't be placed on system or linked tables.

TLV

3313

Can't place this validation expression on this field.

TLV

3314

The field <name> can't contain a Null value because the Required property for this field is set to True.Enter a value in this field.

EXTENDED

3315

Field <name> can't be a zero-length string.

EXTENDED

3316

<Table-level validation text>.

EXTENDED

3317

One or more values are prohibited by the validation rule <rule> set for <field name>.Enter a value that the expression for this field can accept.

UNUSED

3318

Values specified in a TOP clause are not allowed in delete queries or reports.

EXTENDED

3319

Syntax error in union query.

QUERY

3320

<Error> in table-level validation expression.

EXTENDED

3321

No database specified in connection string or IN clause.

REMOTE

3322

Crosstab query contains one or more invalid fixed column headings.

EXTENDED

3323

The query cannot be used as a row source.

QUERY

3324

The query is a DDL query and cannot be used as a row source.

QUERY

3325

Pass-through query with ReturnsRecords property set to True did not return any records.

REMOTE

3326

This Recordset is not updateable.

EXTENDED

3327

Field <name> is based on an expression and can't be edited.

EXTENDED

3328

Table <name> is read-only.

EXTENDED

3329

Record in table <name> was deleted by another user.

EXTENDED

3330

Record in table <name> is locked by another user.

EXTENDED

3331

To make changes to this field, first save the record.

EXTENDED

3332

Can't enter value into blank field on 'one' side of outer join.

EXTENDED

3333

Records in table <name> would have no record on the 'one' side.

EXTENDED

3334

Can be present only in version 1.0 format.

ISAM

3335

DeleteOnly called with non-zero cbData.

JPM

B コードおよび問合せのサンプル

この付録では、AUTONUMBERデータ型のエミュレーション、CASCADE UPDATE参照整合性および名前マッピング問合せをサポートするためのコードおよび問合せの例を示します。内容は次のとおりです。

- B.1 AUTONUMBERデータ型のエミュレーション

- B.2 名前マッピング問合せ

- B.3 デフォルト値

- B.4 列および表の検証

- B.5 CASCADE UPDATEトリガー・コード

B.1 AUTONUMBERデータ型のエミュレーション

Microsoft Accessでは、AUTONUMBERデータ型がサポートされています。AUTONUMBERデータ型は、固有のJet DBMSファイル内の列に対して、一定に増加する長整数型の順序を提供します。Oracleでは順序がサポートされています。順序は、列で一意の識別子として使用可能な番号のセットを生成します。Microsoft AccessのAUTONUMBERとOracleの順序との重要な相違点は、Oracleでは、新規レコードを表に挿入する際に順序番号を列に配置するために、トリガーが必要になることです。

Oracle表へのODBCリンクがJetに存在する場合、挿入の実行時にOracleトリガーによってキー値が変更または初期化されると、Jetは新しいキー値を取得するための一連の問合せを実行し、挿入された行がダイナセットのメンバーになります。Jetが挿入された行を再選択する際に問題が発生した場合、行は#DELETEDと表示されます。これは、更新操作には適用されません。

次の例では、OracleでAUTONUMBERデータ型のエミュレーションを行う方法を示します。

Oracle表

CREATE TABLE                      OTBLAUTONUMBERTEST( PK          NUMBER          (10,0), NAME            VARCHAR2                (50), CONSTRAINT                 PK_OTBLAUTONUMBERTEST PRIMARY KEY (PK))

Oracleの順序

CREATE SEQUENCE   TEST     INCREMENT BY 1    START WITH 1000

トリガー・コード

Create Trigger TRG_CNT_OTBLAUTONUMBERTEST
Before INSERT OR UPDATE on OTBLAUTONUMBERTEST
FOR EACH ROW
DECLARE
iAUTONUMBER SCOTT.OTBLAUTONUMBERTEST.PRIMARYKEY%TYPE;
cannot_change_AUTONUMBER EXCEPTION;

BEGIN
IF INSERTING THEN
SELECT TEST.NEXTVAL into iAUTONUMBER FROM dual;
:new.PRIMARYKEY := iAUTONUMBER;
END IF; -- End of Inserting Code

IF UPDATING THEN
-- Do not allow the PK to be changed.
IF NOT(:new.PRIMARYKEY = :old.PRIMARYKEY) THEN
RAISE cannot_change_AUTONUMBER;
END IF;

END IF; -- End of Updating Code

EXCEPTION
WHEN cannot_change_AUTONUMBER THEN
raise_application_error(-20000,'Cannot Change AUTONUMBER Value');
END;

このトリガーは、表に対するINSERT操作とUPDATE操作の両方をトラップすることによって、AUTONUMBERデータ型のエミュレーションを行います。INSERT操作が実行されると、トリガーは、PRIMARYKEY列について、一連のTESTの次の値を取得します。UPDATE操作が実行されると、トリガーは、AUTONUMBERの更新が試行されているかどうかを確認します。更新中の場合は、例外が発生し、エラーがMicrosoft Accessに戻されます。

UPDATEでAUTONUMBERを暗黙に保護することはお薦めしません。次の例では、Jetはダイナセットを正常に管理することができず、予期しない結果が発生します。

IF UPDATING THEN
-- Do not allow the PK to be changed.

IF NOT(:new.PRIMARYKEY = :old.PRIMARYKEY) THEN
:new.PRIMARYKEY := :old.PRIMARYKEY);
END IF;

END IF; -- End of Updating Code

トリガーにコードを追加してAUTONUMBERフィールドのエミュレーションを制限することによって、Microsoft Accessは行挿入時にAUTONUMBERに対して値を渡すことができます。次のコードでは、渡された値がNULLの場合にのみ、新しいAUTONUMBER値が生成されます。

IF INSERTING THEN
IF (:new.PRIMARYKEY IS NULL) THEN
SELECT test.NEXTVAL into iAUTONUMBER FROM dual;
:new.PRIMARYKEY := iAUTONUMBER;
END IF:
END IF; -- End of Inserting Code

B.2 名前マッピング問合せ

Microsoft Accessで名前マッピング問合せを構築するには、QBEまたはSQLウィンドウのいずれかを使用して問合せを定義します。次の例では、元のMicrosoft Access表SeqDateTableが、O_SEQDATETABLEという名前でOracleにエクスポートされます。エクスポート後に、この表はR_SeqDateTableという名前でJetに添付されます。

次の問合せをSeqDateTableという名前で保存すると、元の表が置き換えられ、Oracleへのマッピングが完了します。この問合せでは、Microsoft Accessで使用できるように、列名PRIMARYKEY、O_SEQUENCEおよびFIRSTDATEが、PrimaryKey、SequenceおよびFirstDateにマップされます。

SELECT             NameMapper.PRIMARYKEY AS PrimaryKey, NameMapper.O_SEQUENCE AS Sequence, NameMapper.FIRSTDATE AS FirstDate FROM R_SEQDATETABLE;

B.3 デフォルト値

Oracleは、宣言的なデフォルト値をサポートしています。ただし、Microsoft AccessからOracleへアプリケーションを移行すると、デフォルト値をサポートするために挿入トリガーが必要な場合があります。すべてのデフォルト処理をトリガーで行うことをお薦めします。これによって、コードが集約され、メンテナンスが簡単になります。次のコード例では、トリガーでのデフォルト値のサポート方法を示します。

CREATE OR REPLACE TRIGGER BIU_M2
BEFORE INSERT OR UPDATE
ON M2
FOR EACH ROW

BEGIN
IF INSERTING THEN
/* Manage Default Values if a new value is NULL */
IF :new.Address IS NULL THEN
:new.Address := 'Default';
END IF;
END IF; -- End of Inserting Code
END; -- Trigger BI_M2

B.4 列および表の検証

Oracleでは、表の制約および列の制約を強制するために使用できるCHECK文がサポートされています。ただし、Microsoft AccessからOracleにアプリケーションを移行する際に、検証をサポートする挿入トリガーが必要な場合があります。次のコード例では、トリガーでの検証のサポート方法を示します。<Access Validation Code>は、Microsoft Accessアプリケーションの検証コードを挿入できる場所を示します。

CREATE OR REPLACE TRIGGER BIU_M2
BEFORE INSERT OR UPDATE
ON M2
FOR EACH ROW

BEGIN
-- Validation Code
IF NOT ( <Access Validation Code > ) THEN
raise_application_error (-20000, '<Access Error Message>');
END IF;
END; -- Trigger BI_M2

B.5 CASCADE UPDATEトリガー・コード

Oracleでは、CASCADE UPDATE参照整合性制約を直接サポートしていません。CASCADE UPDATEがサポートされている場合、主キーが変更されると、リンクされた表の、関連付けられているすべての外部キーも変更されます。CASCADE UPDATEは、アプリケーションの一般的な設計機能ではありません。主キーは、多くの場合、アプリケーションの存続期間中は不変である必要があります。

次のコード例は、2つの表に基づいています。

create table M1 ( f1 number, f2 number, f3 number )
create table M2 (f1 number, f2 number, f3 number )
alter table M1 add primary key (f1)
alter table M2 add primary key (f1)

この定義では、1対多のカーディナリティがサポートされます。1対1カーディナリティのサポートを追加するには、次の定義を追加します。

alter table M1 add constraint uq_M1_001 unique (f2, f3)
alter table M2 add constraint uq_M2_001 unique (f2, f3)

次のコードでは、2つの表M1およびM2に対するCASCADE UPDATEコードが実装されます。この例では、主キー/外部キーのリレーションシップにある2つの列が使用されています。このように複雑なリレーションシップが使用されることは多くありませんが、ここでは、適切なコードを示すために使用されています。

2つの表で、参照整合性の宣言的なサポートとプロシージャによるサポートを共存させることはできません。2つの表の間でCASCADE UPDATEをサポートするには、表の間のすべての宣言的な主キー/外部キーのリレーションシップおよび参照整合性を削除して、かわりに手続き型のコードでサポートする必要があります。次のコード例では、この方法の概要を示します。

CREATE OR REPLACE PACKAGE P_M1 AS
fire_trigger boolean := TRUE;
END P_M1;

CREATE OR REPLACE PACKAGE P_M2 AS
fire_trigger boolean := TRUE;
END P_M2;

CREATE OR REPLACE PACKAGE UQ_M1_M2 AS

PROCEDURE cascade_update (
o_F2    IN  number,
o_F3    IN  number,
n_F2    IN  number,
n_F3    IN  number,
bResult OUT boolean );

PROCEDURE cascade_delete (
F2      IN  number,
F3      IN  number,
bResult OUT boolean );

FUNCTION pk_exists (
F2      IN  number,
F3      IN  number) RETURN boolean;

FUNCTION fk_exists (
F2      IN  number,
F3      IN  number) RETURN boolean;

END  UQ_M1_M2;

CREATE OR REPLACE PACKAGE BODY UQ_M1_M2 AS

/* Procedure cascade_update is called when field(s) */
/*   F2 or                                          */
/*   F3                                             */
/*   are changed in table M1.                       */
/*   The changes are cascaded in table M2           */

PROCEDURE cascade_update (
o_F2    IN  number,
o_F3    IN  number,
n_F2    IN  number,
n_F3    IN  number,
bResult OUT boolean ) IS

CURSOR d_cur (n1 number, n2 number) IS
SELECT * FROM m2
WHERE f2 = n1 AND f3 = n2
FOR UPDATE of f2, f3;

BEGIN

FOR d_cur_rec IN d_cur ( o_F2, o_F3 )
LOOP
UPDATE M2 SET f2 = n_F2, f3 = n_F3
WHERE CURRENT OF d_cur;
END LOOP; -- Detail Record Loop

bResult := true;

END cascade_update;

/* Procedure cascade_delete is called when a record */
/*   in M1 is being deleted and associated          */
/*   child records in M2 must also be deleted.      */

PROCEDURE cascade_delete (
F2      IN  number,
F3      IN  number,
bResult OUT boolean ) IS

CURSOR d_cur (n1 number, n2 number) IS
SELECT * FROM m2
WHERE f2 = n1 AND f3 = n2
FOR UPDATE;

BEGIN

FOR d_cur_rec IN d_cur ( F2, F3 )
LOOP
DELETE FROM M2
WHERE CURRENT OF d_cur;
END LOOP; -- Detail Record Loop

bResult := true;

END cascade_delete;

/* Procedure pk_exists is called to determine is a given
primary key exists in table M1                           */

FUNCTION pk_exists (
F2      IN  number,
F3      IN  number) RETURN boolean IS

l_F2        number;
l_F3        number;
bResult     boolean;

CURSOR p_cur (n1 number, n2 number) IS
SELECT F2, F3 FROM m1
WHERE f2 = n1 AND f3 = n2;

BEGIN
OPEN p_cur( F2, F3 );
FETCH p_cur INTO l_F2, l_F3;
IF p_cur%NOTFOUND THEN
bResult := false;
ELSE
bResult := true;
END IF;

CLOSE p_cur;

RETURN( bResult );

END pk_exists;

/* Procedure pk_exists is called to determine is a given
primary key exists in table M1                           */

FUNCTION fk_exists (
F2      IN  number,
F3      IN  number) RETURN boolean IS

l_F2         number;
l_F3         number;
bResult      boolean;

CURSOR d_cur (n1 number, n2 number) IS
SELECT F2, F3 FROM m2
WHERE f2 = n1 AND f3 = n2;

BEGIN
OPEN d_cur( F2, F3 );
FETCH d_cur INTO l_F2, l_F3;
IF d_cur%NOTFOUND THEN
bResult := false;
ELSE
bResult := true;
END IF;

CLOSE d_cur;

RETURN( bResult );

END fk_exists;

END UQ_M1_M2;

CREATE OR REPLACE TRIGGER AUD_M1
AFTER UPDATE OR DELETE
ON M1
FOR EACH ROW

DECLARE
bResult_OK      BOOLEAN;
bCascadeDeletes BOOLEAN  := TRUE;

BEGIN

IF UPDATING THEN
IF (:old.F2 <> :new.F2) OR (:old.F3 <> :new.F3) THEN
P_M2.fire_trigger := FALSE;
UQ_M1_M2.cascade_update( :old.F2, :old.F3, :new.F2, :new.F3,
bResult_OK );
P_M2.fire_trigger := TRUE;
END IF;
END IF; -- End of Updating Code

IF DELETING THEN
IF bCascadeDeletes THEN
UQ_M1_M2.cascade_delete( :old.F2, :old.F3, bResult_OK );
ELSE
IF UQ_M1_M2.fk_exists( :old.F2, :old.F3 ) THEN
raise_application_error( -20000, 'Rows exist in child table');
END IF;
END IF;
END IF; -- End of Deleting Code

END; -- Trigger AUD_M1

CREATE OR REPLACE TRIGGER AIU_M2
AFTER INSERT OR UPDATE
ON M2
FOR EACH ROW

DECLARE
bResult_OK    BOOLEAN;

BEGIN

IF INSERTING THEN
IF NOT( UQ_M1_M2.pk_exists( :new.F2, :new.F3 ) ) THEN
raise_application_error (-20000, 'No corresponding row in parent
table');
END IF;
END IF; -- End of Inserting Code

IF ( UPDATING AND P_M2.fire_trigger ) THEN
IF NOT( UQ_M1_M2.pk_exists( :new.F2, :new.F3 ) ) THEN
raise_application_error (-20000, 'No corresponding row in parent table');
END IF;
END IF; -- End of Updating Code

END; -- Trigger AUD_M2

索引
A  B  C  D  E  F  H  I  J  L  M  N  O  P  Q  R  S  T  U  V

A

高度なサーバー機能, 2.2

アプリケーションの起動パフォーマンス, 5.3

B

マッピング問合せの作成, B.2

C

CASCADE UPDATE参照整合性制約, B.5

CASCADE UPDATEトリガー・コード, B.5

デフォルトのデータ型の変更, 3.3

クライアント/サーバー, 2.2

列の検証, B.4

Config, 5.2

D

Data Access Object, 2.1

Oracle Modelのデータベース・ユーザー, 2.2.5

宣言的なデフォルト値, B.3

宣言的な参照整合性, 2.1.3

デフォルトのデータ型マッピング, 3.3

ドライバ

ODBC, 5.1

ドロップダウン・リスト, 5.5.3 ダイナセット, 2.1.1 ダイナセットおよび主キー, 2.3

E

COUNTERデータ型のエミュレーション, B.1

エラー

Microsoft Accessデータベースの変更, 4.6

明示的なトランザクション・モデル, 2.1.5 拡張, アプリケーション, 2.6

F

フィールド名

長さに関する考慮点, 2.4.1

アンダースコアによる空白の置換え, 2.4.1

FORCEオプション

ビューの作成での使用, 3.5

H

ハード・ロック, 2.1.2

I

暗黙的なトランザクション・モデル, 2.2.4

J

Jet, 2.1

Jetデータ型, 3.2

Jetのエラー・メッセージのクラス, A.1

Jetのエラー・メッセージ, A.2

Jetの複数ユーザーによる更新, 2.1.2

Jetのレコードセット, 2.1.1

Jetのトランザクション, 2.1.5

L

大規模なアプリケーション, 5.1

M

Microsoft Accessのデータ型, 3.2

移行プロセス, 2

Microsoft Accessデータベースの変更

エラー, 4.6

MSysConf表, 5.2 複数ユーザーのMicrosoft Accessアプリケーション, 2.1

N

nValue, 5.2

O

ODBC, 2.2.4

ODBCドライバ, 5.1

OMWB_EMULATIONユーザー, 2.2.5

1対多のカーディナリティ, 2.1.3, B.5

1対1のカーディナリティ, 2.1.3, B.5

コミット時ロック, 2.1.2

Oracleアーキテクチャ, 2.2

Oracleのデータ型, 3.1

Oracleの予約語, 3.4

P

パラメータ表, 5.2

ODBCドライバのパフォーマンス, 5.1

スナップショットおよびダイナセットのパフォーマンス, 5.5.2

即時ロック, 2.1.2

ピボット・テーブル

TRANSFORM文の移行, 3.6

PL/SQL, 2.2.2 移行の準備, 2.4 主キーおよびダイナセット, 2.3

Q

条件付きの問合せ, 5.5.1

問合せ

Oracleビューへの変換, 3.5

R

ネットワークの通信量の減少, 5.5.1

参照整合性, 2.1.3

問合せによるリレーション, 4.2

Microsoft Accessセキュリティの削除, 4.1

予約語の競合, 3.4

制限付きの問合せ, 5.5.1

結果セット, 大きい, 5.5.2

結果セット, 小さい, 5.5.2

S

セキュリティ, Microsoft Accessからの削除, 4.1

順序, 2.2.3

順序, 定義, B.1

シングル・ユーザーのMicrosoft Accessアプリケーション, 2.1

スナップショット, 2.1.1

ストアド・プロシージャ, 2.2.1

サポートされているOracleのデータ型, 3.1

T

表名

長さに関する考慮点, 2.4.1

アンダースコアによる空白の置換え, 2.4.1

表の検証, B.4 トランザクション, 2.1.5 ピボット・テーブルのTRANSFORM文

移行, 3.6

トリガー, 2.2.1 チューニング, 5

U

ユーザー

Oracle Model, 2.2.5

V

ビュー

Microsoft Accessの問合せの移行, 3.5

FORCEオプションなしでの再コンパイルまたは再構築が必要, 3.5

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2014, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

制限付権利

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。