このサイトをビューするために JavaScript を有効化してください。

Altova MapForce 2020 Enterprise Edition

このサンプルは、データベースを変更するマッピングを実行する際にデータベースの例外を処理する可能な方法について説明しています。このサンプル内で使用されているデータベースはユーザーレコード (users テーブル) とアドレス (addresses テーブル) を保管します。各ユーザーはゼロ、1つ、または2つのアドレスを持つことができます (例えば、自宅の住所と職場の住所)。具体的には、アドレス内の各アドレスには、 users テーブル内の idフィールドを指す user_id フィールドが含まれています。 users テーブルはこのため addresses のための「親」テーブルです。下のリスティングは両方のテーブルのための SQL 作成スクリプトを示しています (構文が SQLite データベースに適用できることに注意してください):

 

CREATE TABLE
      users (id INTEGER NOT NULL PRIMARY KEY,
      first_name TEXT NOT NULL,
      last_name TEXT NOT NULL,
      email TEXT UNIQUE NOT NULL);
 
CREATE TABLE
      addresses (id INTEGER NOT NULL PRIMARY KEY,
      user_id INTEGER NOT NULL,
      is_shipping INTEGER,
      is_billing INTEGER,
      type TEXT NOT NULL,
      city TEXT NOT NULL,
      street TEXT NOT NULL,
      number INTEGER NOT NULL,
      FOREIGN KEY (user_id) REFERENCES users (id) ) ;

ソーステーブル

必要条件は usersaddresses テーブル からのすべてのデータを新規のテーブルすなわち new_usersnew_addresses テーブルにコピーします。これらのテーブルは usersaddresses テーブルに類似しています。唯一の違いは テーブル new_addresses は下のコードリスト内でハイライトされている通り列 is_shipping と is_billing のために値を許可しません。これは、値が発生すると例外が発生することを意味するためこれは重要です。

 

CREATE TABLE

      new_users (id INTEGER NOT NULL PRIMARY KEY,

      first_name TEXT NOT NULL,

      last_name TEXT NOT NULL,

      email TEXT UNIQUE NOT NULL);

 

CREATE TABLE

      new_addresses (id INTEGER NOT NULL PRIMARY KEY,

      user_id INTEGER NOT NULL,

      is_shipping INTEGER NOT NULL,

      is_billing INTEGER NOT NULL,

      type TEXT NOT NULL,

      city TEXT NOT NULL,

      street TEXT NOT NULL,

      number INTEGER NOT NULL,

      FOREIGN KEY (user_id) REFERENCES new_users (id) ) ;

ターゲットテーブル

古いテーブルから新しいテーブルに全てのデータをコピーするマッピングは以下に示されています。このマッピングを次のパスで見つけることができます: <マイ ドキュメント>\Altova\MapForce2020\MapForceExamples\Tutorial\DatabaseExceptions.mfd

mf_rollback_ex_01

上で表示されている通り、このマッピングはデータをそのまま同じデータベースに属するソースデータベースコンポーネントからターゲットデータベースコンポーネントにコピーします。 唯一の違いは、ソースとターゲットテーブルが異なる点です。ターゲットコンポーネントのタイトルバーをダブルクリックすると、各入力アクションの前に全てのレコードセットが削除されていることに注目してください。これにより、ターゲットテーブルが各挿入の前に空であることを保証することができます。

mf_rollback_ex_02

上記の通り、ソース addresses テーブルに null 値が含まれていない場合、例外が発生します。以下の通りテーブルに null 値が含まれていないかをチェックすることができます:

 

1.「DB クエリ」 タブをクリックします。

2.addresses テーブルの横のボタンを右クリックし、 「SQL エディター | SELECT」 内で表示を選択します。

3.「クエリの実行」 ic_execute-sql をクリックします。

mf_rollback_ex_03

上で表示されている通り、ソース addresses テーブル内に複数の NULL フィールドが存在します。この点を考慮して、マッピングを実行する際に、例外を扱うための複数のオプションを使用することができます。例:

 

A) 例外が発生すると、全ての変更がロールバックされます。すなわち、ソースデータに無効なレコードが含まれているとレコードが挿入されません。

B) 例外が発生すると、例外が発生する箇所でレコードをスキップし、有効なレコードを挿入し続けます。

 

シナリオ A: 例外の場合に全ての変更をロールバックする

必要条件: 例外が発生するとデータベースへ加えられた全ての変更をロールバックします。この目的を達成するためにマッピングを構成する方法は以下のとおりです:

 

1.ターゲットデータベースコンポーネントのタイトルバーを右クリックし、コンテキストメニューから 「プロパティ」 を選択します。または、タイトルバーをダブルクリックします。これにより、データベースコンポーネント設定  ダイアログボックスが開かれます。

2.「トランザクションの使用」 チェックボックスを選択し、「トップトランザクションをロールバックして停止します」を選択します。

 

マッピングが上記のように構成されていると、例外の発生は、データベースコンポーネントレベルでのトップレベルのトランザクションのロールバックを引き起こします。これらの設定を使用してマッピングを実行するには以下を行います :

 

1.「出力」 タブをクリックします。

2.出力メニューから、「SQL-Script の実行」 をクリックします。ソースアドレステーブル内の null 値のため、このステージでは、マッピングは例外に遭遇します。データベーストランザクション例外 ダイアログボックスが表示されます。

mf_rollback_ex_04

3.デフォルトの選択済みのオプションを変更せず、「OK」をクリックします。

 

結果は以下のようになります:

 

全ての変更がロールバックされます。

new_users テーブル内にレコードは挿入されません。

new_addresses テーブル内にレコードは挿入されません。

 

シナリオ B) 「現在のトランザクションをロールバックし、継続する」を実行する

必要条件: 例外を生成するレコードをスキップし、有効なレコードを挿入し続ける。この目的を達成するためにマッピングを構成する方法は以下のとおりです:

 

1.new_users テーブルの横の mf_ic_del_a_in ボタンをクリックし、 「トランザクションの使用」 チェックボックスを選択し、「現在のトランザクションをロールバックし、継続する」を選択します。

2.new_addresses テーブルの横の mf_ic_a_in ボタンをクリックし、「トランザクションの使用」 チェックボックスを選択し、「現在のトランザクションをロールバックし、継続する」を選択します。

 

マッピングをこれらの設定(データベーストランザクション例外 ダイアログボックス)で実行します。以下に示されるようにオプションを選択して、現在のトランザクションをロールバックし、マッピングの実行を継続します:

mf_rollback_ex_05

結果は以下のようになります:

 

エラーを伴うトランザクションはすべてロールバックされます。

(データベース例外によりユーザーレコードが生成されていないため) 5 人中5人のユーザーが挿入されます

(3 つのアドレスが値を含み例外が生成されているため) 5 つのアドレス中2つのアドレスが挿入されます

 

シナリオ C) 「トップトランザクションをロールバックし、継続する」 を実行する

必要条件: アドレスの挿入に失敗した場合、親ユーザーレコードも挿入されるべきではありません。これを達成するためにマッピングを以下のように構成します:

 

1.データベースコンポーネントのタイトルバーをダブルクリックし、 「トランザクションの使用」 チェックボックスをクリアします。

2.new_users テーブルの横の mf_ic_del_a_in ボタンをクリックし、 「トランザクションの使用」 チェックボックスを選択し、「現在のトランザクションをロールバックし、継続する」を選択します。

3.new_addresses テーブルの横の mf_ic_a_in ボタンをクリックし、「トランザクションの使用」 チェックボックスを選択し、「トップトランザクションをロールバックし、継続する」を選択します。

 

この設定でマッピングを実行すると、データベーストランザクション例外ダイアログボックスが表示されます。以下に示されるようにオプションを選択し、プロンプトされる回数どおり選択を繰り返します:

mf_rollback_ex_06

結果は以下のようになります:

 

2 人のユーザーが挿入されます (Sharda Junker、Tobie Hughey)

1 つのアドレスが挿入されます

 

説明: ユーザー 「Sharda Junker」はアドレスを持たない唯一のユーザーです。このレコードのために例外は発生しません。 2番目のユーザーである「Tobie Hughey」はこのアドレスレベルで例外が発生していない唯一のユーザーであるため挿入されています。 他のユーザーレコードは、例外が発生しトランザクションがロールバックされているアドレスを持っているため挿入されていません。

 

nulls を持たないため、例外をスローしない2つのアドレスが存在します。 これらは id=1id=4. を持つアドレスです。最初のアドレスのための挿入トランザクションは、しかしながら、ユーザートランザクションがロールバックされる必要があったため、ロールバックされています。 このため、 id=4 を持つアドレスのみが挿入されています。

 

同じ結果を以下のように達成することができます:

 

1.new_users テーブルの横の mf_ic_del_a_in ボタンをクリックし、「トランザクションの使用」 チェックボックスを選択し、「現在のトランザクションをロールバックし、継続する」を選択します。

2.new_addresses テーブルの横の mf_ic_a_in ボタンをクリックし、「トランザクションの使用」 チェックボックスをクリアします。

 

MapForce Server を使用してマッピングを実行する方法

ライセンス供与済みの MapForce Server を使用する場合、コマンドライン、 Linux、 macOS、 または Windows マシン上でマッピングを以下の通り実行することができます:

 

1.メニューコマンド 「ファイル | MapForce Server 拡張ファイルにコンパイルする」,を使用して MapForce Server 拡張ファイル (.mfx) へマッピングをコンパイルします。 MapForce Server 拡張ファイルにマッピングをコンパイルするも参照してください。

2..mfx ファイルと ExceptionsDemo.sqlite データベースをサバ―マシン上のディレクトリにコピーします。これを「作業ディレクトリ」 と呼ぶことにします。

3.コマンドプロンプトを作業ディレクトリに変更し、以下のコマンドで MapForce Server を実行します:

 

mapforceserver run DatabaseExceptions.mfx

 

メモ:

 

mapforceserver は使用中のオペレーティングシステムのための MapForce Server 実行可能ファイルへのパスです。 .mfx ファイルへのパスを適用できるように変更します。例えば、Linux マシンでは、 パスは以下のとおりです: /opt/Altova/MapForceServer2020/mapforceserver.

 

サーバーの実行の場合、オンデマンド、または再帰的に API 呼び出し、またはFlowForce Server ジョブとしてマッピングを実行することができます。 詳細に関しては、MapForce Server を使用して自動化するを参照してください。 .

(C) 2019 Altova GmbH