> ## Documentation Index
> Fetch the complete documentation index at: https://www.integrate.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# ETL: Xplenty中級編 Part4： DB周りの設定（Destination編）

> データベースがDestinationの場合のロードエラー時の挙動、スキーマ変更オプション、Merge設定など、よくある質問について解説します。

今回は、お客様からの質問が多いデータベース周りの細かい設定について、データベースがDestination（送信先）の場合の設定について解説します。

## Q. Xplentyのジョブでデータベースへロード時にエラーが発生した場合、どうなりますか？

A. あるジョブでデータベースへのロード時にエラーが発生した場合、ジョブのステータスとしては、エラーになります。問題は全てのデータが無効になるのか、それまで書き込まれていたデータはそのままデータベースにロールバックされずに残るのかという点ですが、これはXplenty側のパッケージでどのオプションを設定しているかによって変わります。

<Frame>
  <img src="https://mintcdn.com/integrateio/S5PjFuXd0nNm4BaF/images/japanese-knowledge-base/intermediate-part04-jp/image-1.webp?fit=max&auto=format&n=S5PjFuXd0nNm4BaF&q=85&s=43fa2aed306f811568871c6957b10c62" alt="intermediate-part04-jp image 1" width="524" height="537" data-path="images/japanese-knowledge-base/intermediate-part04-jp/image-1.webp" />
</Frame>

### Transaction per connectionにチェックがONの場合

この場合は「Batch size」に関係なく、コネクションレベルで制御されます。**Max paralell Connectionsが１の場合は**、ジョブ実行中にエラーが発生した場合、そのジョブで更新された行はすべてロールバックされ、結果としてデータベース側はジョブ実行前の状態に戻されます。（データ更新なし）

### Transaction per batchにチェックがONの場合

この場合は、Batch sizeで指定された値（レコード数のことです）で処理が随時コミットされます。例えば、Batch sizeを1000とした場合、1000行ごとにコミットされます。もし、3000件更新するジョブがあるとして、最初の1000件は問題なくコミットでき、その次の1000件を処理中にエラーが発生した場合、ジョブは、その時点でエラーとなり終了しますが、最初のコミット済みの1000件分の更新は、データベース側に反映され、ジョブが終了します。（一部反映）

## Q.更新されるデータが書き込み先のスキーマ定義と異なる場合は、Xplenty側でスキーマを変更するオプションはありますか？

A.データベースでA、B、Cのフィールドを持つスキーマ構造に対し、A、B、C、Dのデータを持つ場合、スキーマ構造を変更し、フィールドDをテーブルに追加するオプションがあります。

<Frame>
  <img src="https://mintcdn.com/integrateio/S5PjFuXd0nNm4BaF/images/japanese-knowledge-base/intermediate-part04-jp/image-2.webp?fit=max&auto=format&n=S5PjFuXd0nNm4BaF&q=85&s=fa96766a494936c1bc4bc0b9687d83c1" alt="intermediate-part04-jp image 2" width="509" height="315" data-path="images/japanese-knowledge-base/intermediate-part04-jp/image-2.webp" />
</Frame>

注意：ある日データソースで勝手に列フィールドが増えていて、それを自動的に検知し、ジョブ定義に自動的に反映する機能はありません。このオプションは、あくまで増えたフィールドに対応する形でジョブ定義をマニュアルで変え、それにより、Xplentyからデータベースに対してAlter tableを実行し、スキーマ構造を変更することができる機能です。

### 柔軟なSQLによる前処理/後処理が可能

さらに、より柔軟にデータベースを制御できるようにデータのロード前と後の両方でSQL実行をサポートしています。これにより、例えば、ELTシナリオの場合、データを一度DWH側に投入し、投入後にSQLを利用してViewを作成したり、投入後のデータをUpdate文で加工するなど、柔軟に行うことができます。また、ロード前にテーブルを作成したり、xxx日以前のデータは削除する、もしくは一括で論理削除するといった処理も可能です。

<Frame>
  <img src="https://mintcdn.com/integrateio/S5PjFuXd0nNm4BaF/images/japanese-knowledge-base/intermediate-part04-jp/image-3.webp?fit=max&auto=format&n=S5PjFuXd0nNm4BaF&q=85&s=b9dd1a3c29c5853517c1d33444ffa886" alt="intermediate-part04-jp image 3" width="948" height="636" data-path="images/japanese-knowledge-base/intermediate-part04-jp/image-3.webp" />
</Frame>

## データベースへ書き込む際のMergeオプションとその動きについて

データベースに書き込む際に以下の２種類のMergeオプションを選択可能です。それぞれの処理の特徴を理解し、正しいオプションを選択してください。

### Merge with existing data using delete and insert

これから書き込むデータと書き込み先のテーブルの両方に存在する（Upsertキーが重複する）レコードについて書き込み先のテーブル削除してから、すべてのデータをターゲットテーブルに挿入することで、データをテーブルの既存データにマージします。フィールドマッピングでUpsertキーを正しく設定する必要があります。マージは次のような手順で行われます。

* Step1 ： データベースのデフォルト・スキーマのキー・マッピングに従って、主キーを持つステージング・テーブルが作成されます。
* Step2 ： データフローの出力がステージング・テーブルに一括コピーされます。
* Step3 ： ステージング・テーブルに存在するキーを持つ行がターゲット・テーブルから削除されます。ステージング・テーブルのすべての行がターゲット・テーブルに挿入されます。ステージング・テーブルが削除(Drop)されます。

### Merge with existing data using update and insert

既存のデータに対してはUpdateし、新しいデータはInsertすることで、入力されたデータをテーブルの既存のレコードに対しマージします。フィールドマッピングでマージキーを正しく設定する必要があります。マージは次のような手順で行われます。

* Step1 ： データベースのデフォルト・スキーマのキー・マッピングに従って、主キーを持つステージング・テーブルが作成されます。
* Step2 ： データフローの出力がステージング・テーブルに一括コピーされます。
* Step3 ： データベース固有のコマンドが発行され、既存のレコードが更新され、挿入されます。ステージング・テーブルは削除(Drop)されます。

## 最後に

データベースの場合のオプションを正しく理解することで、よりきめ細かい設定が可能になります。また、データベースに関連するJDBC関連のシステム変数パラメータの設定も可能です。
