| Oracle Database 2日で開発者ガイド 11g リリース1(11.1) E05694-03 |
|
この章では、アプリケーションをサポートするデータベース・オブジェクトのパッケージを作成し、インストールする方法を説明します。たとえば、このガイドの以前の説明に従った場合、作成したオブジェクトを使用します。他のシステムにデプロイするオブジェクト定義およびデータを収集するプロセスを説明します。実際の環境で、操作はこのガイドで説明されているように単純ではない可能性がありますが、手順および考慮事項は同じです。
すべてのオブジェクト名には一貫した接頭辞を使用することをお薦めします。これによりオブジェクトを簡単に識別できます。SQL Developer接続ナビゲータ・ディスプレイで、またOracleデータベースのデータ・ディクショナリに対してSQL Developerレポートおよびパフォーマンスの問合せを確認する場合に、一貫した接頭辞によりオブジェクトが分類されます。
この章の内容は次のとおりです。
アプリケーションをサポートするデータベース・オブジェクトがデプロイされていない場合、アプリケーションのデプロイメントも通常完了しません。参照表のシード・データなどの必要なすべてのデータ、およびデータベース・オブジェクトの両方を作成するスクリプトの作成によって、これらのオブジェクトをデプロイできます。データベース・オブジェクトには、アプリケーション・ロジックを実装するように作成した表、ビュー、ファンクション、パッケージおよびその他が含まれます。
Oracle Databaseのアプリケーションをデプロイする際は、次のシステム環境を作成する必要があります。
初期のデプロイメント、他の環境にアプリケーションをデプロイする前のアプリケーションの全体のテスト、およびアプリケーション・ユーザーの研修に対して、テスト環境を常に用意する必要があります。
テストでは、アプリケーションの機能および正確にパッケージしたかどうかがチェックされます。アプリケーションと依存関係にあるオブジェクトがない場合、本番環境で実際のユーザーにデプロイされた後ではなく、テスト中にオブジェクトを取り込むことができます。
アプリケーションが非常に複雑で、ユーザーがリソースを所持する場合、システムに対する変更を厳格にチェックできるQA環境を作成します。
教育環境では、他の環境へ影響を与えずに内部ユーザーまたは外部ユーザーに研修および実習を提供できます。本番環境の前または後に教育環境を作成でき、また他の環境への更新とは無関係に教育環境を更新できます。
本番環境には、企業の通常業務の実際のデータおよびデータベース・オブジェクトが含まれます。本番環境に移る前に、テスト環境ですべてのオブジェクトをテストします。
デプロイする環境の種類にかかわらず、デプロイメント・プロセスは同一です。
アプリケーションをデプロイする前に、データベース・オブジェクト間の依存性を理解する必要があります。オブジェクトが他のオブジェクトと依存関係にある場合、依存オブジェクトはいずれの場合にも存在するため、適切な順序でオブジェクトを作成する必要があります。依存オブジェクトが存在しない場合、発生するエラーまたは問題は次のとおりです。
データをデプロイするには、各表のデータに対して次のいずれかの方法を使用できます。データの妥当性の度合いに応じて方法を選択します。
この方法は、データがあらゆる制約に違反しない場合、主キー列および一意キー列に重複する値が存在しない場合、すべての外部キー参照がすでに存在する場合、およびチェック制約により制御されているすべての列のデータが制約を満たす場合に使用できます。たとえば、開発環境から参照データを単純にロードする場合や適切な順序でデータをロードする場合は、制約には違反しないため、制約を無効化する必要はありません。
データの順序付け(ロードする表および依存データが多くある場合など)をせずにデータをロードする場合、または外部のソース(古いアプリケーション、フラット・ファイルまたはスプレッドシートなど)からデータをロードする場合、データをロードする前に制約を無効化する必要があります。
すべてのデータが制約を満たすことに失敗した場合、制約は有効化されず、データを修正して再試行する必要があります。
異なるタイプのデータベース・オブジェクトに対してインストール・スクリプトを実行する順序の一般的なガイドラインは次のとおりです。
パッケージの仕様部は、常に有効な状態で、他のオブジェクトに参照される場合があるため、最初にスクリプトを実行します。パッケージ本体は、他のオブジェクト・タイプを参照するため、最後に作成する必要があります。依存性の問題のため、ファンクションおよびプロシージャをパッケージに含めることをお薦めします。
このガイドの他の項の説明に従った場合、サンプルのOracle HRスキーマにオブジェクトをすでに作成しています。この項では、別の標準のHRスキーマにオブジェクトをデプロイすると想定します。
作成した表で、scoresにはperformance_partsおよびevaluations両方に対する外部キーが含まれます。これは、参照表の主キーが作成されるまでこれらの外部キーを作成できないということです。最初にevaluations表および制約を作成し、次にperformance_parts表、そしてscores表を作成します。表、順序およびトリガーに対してスクリプトが1つのみ存在します。このため、この実行に対する手動編集を最小化できます。また、それぞれにスクリプトが1つのみ含まれるため、ファンクションおよびパッケージのスクリプトを1つ作成できます。最後に、シノニムおよびビューのスクリプトを作成します。
これは非常に単純なデプロイメントの一例です。実際のアプリケーションでは、データベース設計者と話し合い、オブジェクトの作成順序を計画する必要があります。Entity Relationship Diagramなどの設計のダイアグラムがあると、このフェーズで非常に役立ちます。
この項では、データベース・オブジェクトのエクスポート方法を説明します。
データベース・オブジェクトを作成するためにスクリプトを保持している場合、それらのスクリプトを使用できます。スクリプトを保持していない場合、データベースの各オブジェクトの定義に基づいたそれぞれのオブジェクトのデータ定義言語(DDL)を生成する必要があります。データベース・オブジェクトにDDLを生成するには、Oracle SQL Developer、特にDDL(およびデータ)のエクスポート機能を使用できます。この機能では、指定したオブジェクトおよびオブジェクトのタイプを作成するDDL文が生成されます。また、作成した新しい表へエクスポートされたデータを挿入するINSERT文を生成できます。
Oracleインストール・ディレクトリとは別にこのディレクトリを作成します。たとえば、C:¥my_exportsです。
C:¥my_exports¥hr_export.sqlです。
CREATE文が含まれます。このオプションを選択しない場合、スキーマ名にはCREATE文は含まれません。このオプションはエクスポートされたオブジェクトを異なる名称を持つスキーマで再作成する場合に便利です。
STORAGE句すべてがエクスポートされたDDL文で保存されます。現行の記憶域定義を使用しない場合(異なるシステム環境でオブジェクトを再作成する場合など)、このオプションの選択を解除します。
FORCEオプションがすべてのCREATE VIEW文に追加され、各ビューにエラーが含まれる場合でもビューが作成されます。
CREATE TABLE文で定義されるかわりに、個別のALTER TABLE文で定義されます。
CREATE文の前にDROP文が含まれ、同じ名前を使用してすべての既存のオブジェクトを削除します。
順序およびトリガーをエクスポートする場合、特殊な考慮事項が要求されます。順序に関して、生成されたDDLは現行の値に関連する順序を開始します。表をロードする主キーおよびデータの移入に使用されている順序がある場合、その順序を保持します。ただし、データをロードしない場合、スクリプトの作成後にスクリプトを編集して、START WITH値をリセットできます。
トリガーに関して、前に挿入するトリガーが表に存在していて、データのロードを計画する場合、トリガーを確認し、指定したアクションをトリガーで発生させるどうかを決定する必要があります。たとえば、主キー値は高い頻度でトリガーによって移入されます。INSERT文から主キーを保護するには、主キー値がNULLのときにのみ、トリガーによって主キーが移入されるようにします。次に例を示します。
IF :new.evaluation_id IS NULL THEN SELECT evaluations_seq.Nextval INTO :new.evaluation_id FROM dual; END IF;
ただし、トリガーを前述の例のように指定しない場合、データをロードする前にトリガーを指定しなおすか、トリガーを無効にして、データのロードの完了後にトリガーを有効にする必要があります。また、順序の現行の値が、主キー列の最高値よりも大きいことを確認します。
監査列(CREATED_ONまたはCREATED_BYなど)がトリガーによって移入された場合、現行の値がNULLである場合のみに使用するトリガーを新しい値に設定することでソース表からデータを保護する必要があります。次に例を示します。
if :new.created_on is null then :new.created_on := sysdate; end if;
このガイドの説明を使用して作成した表ではどのトリガーも使用されない場合、スクリプトの生成に関する関連項目の説明に従って生成されたコードを編集する必要はありません。
このガイドの前の項の操作に従った場合には作成済の順序および表を作成するスクリプトを生成します。このスクリプトによって、必要な制約、索引およびトリガーも作成されます。
Oracleインストール・ディレクトリとは別にこのディレクトリを作成します。たとえば、C:¥my_exportsです。
C:¥my_exports¥2day_tables.sqlです。
CREATE TABLEの後の別のSQL文に制約を追加します。
オブジェクト定義は、オブジェクト・タイプによってアルファベット順でファイルに追加されます。順序は作成される最初のオブジェクトです。順序はevaluationsのトリガーによって参照されるため、便利です。表の依存性には、最初にevaluationsを作成し、次にperformance_parts、そしてscoresを作成することが必要です。これらは、アルファベット順で発生するため、変更を加える必要はありません。ただし、変更が必要な場合、テキスト・エディタを使用するか、SQL Developer内で生成したスクリプトをオープンして、生成したスクリプトを編集することは可能です。
このガイドのこのガイドの前の項の操作に従った場合には作成済のパッケージ(ファンクションを含む)を作成するスクリプトを生成します。
C:¥my_exports¥2day_plsql.sqlです。
このガイドのこのガイドの前の項の操作に従った場合には作成済シノニムおよびビューを作成するスクリプトを生成します。
C:¥my_exports¥2day_other.sqlです。
表、PL/SQLオブジェクト、シノニムおよびビューを作成するスクリプトを生成した後に、ターゲット・データベースに移行するデータすべてを取得するスクリプトを生成できます。
データをエクスポートするには、デプロイされた表に挿入するために既存の表データを取得する必要があります。「デプロイメントの計画」で説明されているように、すべての依存データが存在し、妥当性の問題がないことを確信している場合は、ターゲット・スキーマにデータを挿入できます。または制約を無効にしてデータをロードし、ロードが完了した後、制約をもう一度有効にすることも可能です。
無効化を選択し、その後に制約を有効化した場合、次のオプションがあります。
2day_tables.sqlファイルを編集します。
EVALUATIONS、PERFORMANCE_PARTS、およびSCORES表で使用される制約を検索および有効化するには、「SQL Worksheet」ウィンドウに次の文を入力します。
SELECT 'ALTER TABLE '|| TABLE_NAME || ' DISABLE CONSTRAINT '|| CONSTRAINT_NAME ||';' FROM user_constraints WHERE table_name IN ('EVALUATIONS','PERFORMANCE_PARTS','SCORES'); SELECT 'ALTER TABLE '|| TABLE_NAME || ' ENABLE CONSTRAINT '|| CONSTRAINT_NAME ||';' FROM user_constraints WHERE table_name IN ('EVALUATIONS','PERFORMANCE_PARTS','SCORES');
このガイドの説明に従った場合、データを追加した表はperformance_partsのみです。DDL(およびデータ)のエクスポート機能を使用してデータをエクスポートしますが、この方法はデータとともにDDLを出力します。また、「Connections」ナビゲータの「Connections」にあるツリー内から表を選択し、右クリックして「Export Data」を選択した後、INSERTを選択します。このオプションを使用すると、選択した列へのエクスポートを制約でき、またどのデータをエクスポートするか制御するWHERE句を含めることができます。これが使用する方法です。
hr_conn)を生成するために使用したデータベース接続を展開します。
hr_conn接続で「Tables」を展開します。
C:¥my_exports¥2day_data.sqlを入力してエクスポート・ファイル名を指定します。
他の表にINSERT文を作成する必要がある場合、ファイルを区別する他の表のデータをエクスポートすることもできますが、クリップボードへデータをエクスポートして最初のファイルに貼り付けることもできます。これを行うには、出力の「Clipboard」を指定します。これによって文がクリップボードに置かれ、ファイルに追加できます。
この段階で、別のスキーマでオブジェクトを作成するために必要なスクリプト・ファイルをすべて保持しています。これらのスクリプトは次の順序(この演習でスクリプトを作成した順序)に従って実行します。データをロードする前に表が存在することを確認します。
必要に応じて、適切な順序でこれらのスクリプトを実行するマスター・スクリプトを作成して、ファイルに結果を記録できます。この種類のマスター・スクリプトは、SQL*Plusを使用して一般的に実行されます。この演習のマスター・スクリプトは次の例と同様です。
spool my_dir/create_log.txt @my_dir/2day_tables.sql @my_dir/2day_plsql.sql @my_dir/2day_other.sql @my_dir/2day_data.sql commit; spool off
作成したスクリプトを実行するSQL Developerも使用できます。マスター・スクリプトがファイル・パスおよびファイル名を完全に指定する場合(たとえば、C:¥my_dir¥2day_tables.sql)、マスター・スクリプトをオープンおよび実行できます。また、各スクリプトを個々にオープンおよび実行できます。
2day_tables.sqlファイルを検索およびオープンします。表の作成のためのDDL文を表示します。次の手順では、各文の結果が成功か失敗かを監視するためにスクリプトとしてこれらの文を実行します。
各文の結果は、「Script Output」ペインに表示されます。各文が正常に実行された結果が表示されます。
表データの挿入のためのDDL文を表示します。次の手順では、各文が成功したか、または失敗したかを監視するためにスクリプトとしてこれらの文を実行します。
Oracleでは、DML文は自動的にコミットされません。これはINSERT、UPDATEまたはDELETE文をロールバックできるという意味です。データベースにデータを格納するには、次の手順で実行するトランザクションのコミットが必要になります。
アプリケーションをサポートするすべてのデータベース・オブジェクトを作成した後、SQL Developerを使用して新規オブジェクトの定義にアクセスできます。また、SQL Developerレポートを使用してインストールが有効かどうかの判断に役立つ情報を確認できます。これらのレポートには次の項目が含まれます。
指定した各レポートで、バインド変数を要求される際に(表示を制限しない場合は)、使用するデータベース接続を選択して「Apply」をクリックします。
データベース・アプリケーションのデプロイおよびインストールの検証後、アプリケーションのインストール・スクリプトを作成した場合、作成時および各スクリプトの目的を記したコメントを使用して、ソース・コード制御システムでインストール・スクリプトのアーカイブを検討します。このアーカイブは、別の環境へデプロイする必要がある際に便利です。そのスクリプトを使用してクリーンなインストールを再作成できます。データをアーカイブするには、Oracle Data Pumpを使用できます。
|
![]() Copyright © 2005, 2008, Oracle Corporation. All Rights Reserved. |
|