本記事ではCData Sync V24.2 で新しく対応したDataverse / Dynamics 365 の変更データキャプチャ(CDC)を利用した差分更新の設定方法についてご紹介いたします。
Dataverse / Dynamics 365 では外部への連携で商談情報や取引先情報を扱うことが多いかと思います。例えば、案件ロストのために商談情報を削除するケースもあるかと思います。今までだと物理的に削除されたレコードの検知をするシステムの構築は困難でしたが、CDC を利用することで、物理的に削除されたレコードの追跡が簡単にできるようになりました。
CDC 機能についてより詳しく知りたい方はこちらの記事をご参考にしてください。
Change Data Capture(CDC)とは?CDC の基本からCData Sync のCDC 機能まで詳しく解説
シナリオ
今回の例ではDataverse / Dynamics 365 の取引先企業のデータをSnowflake へ一度レプリケーションした後に、Dataverse / Dynamics 365 上で取引先企業のデータ更新、レコード削除を行い、Snowflake 上にいずれの変更も反映されていることを確認していきます。
事前確認/設定
Sync で実際にDataverse / Dynamics 365 のCDC を利用する前に、Dataverse / Dynamics 365 上で連携するテーブルの変更追跡が有効化されている必要があります。もし有効化されていない場合にそのテーブルに対してCDC を利用した連携を行うとエラーに落ちてしまいます。Sync 内部では変更追跡のWeb API を利用しているためこのような設定が必要になります。有効化されているかの確認、もしくは無効から有効に変更するためには Power Apps 上で以下の手順で確認することができます。無効から有効にすることはできますが有効から無効には戻すことはできないので、設定変更の際は注意してください。またこの設定の有効化はカスタムテーブルでも可能なものになります。
1. Power Apps 上で連携したいテーブルの編集画面を開く
2. [プロパティ] → [高度なオプション] → [変更を追跡] にチェックがついていることを確認する。チェックがついていなければチェックをつける。
これでCDC 連携の準備は完了となります。
設定方法
連携したいテーブルの変更追跡の設定が完了できたら、実際にSync での設定に移ります。設定はジョブ作成時に種類を変更データキャプチャに設定するだけです。右上のジョブを追加から、ジョブ名を入力し、データソースにDataverse / Dynamics 365、同期先は任意のものを選択し、種類を変更データキャプチャに設定してジョブを追加します。今回は同期先にSnowflake を選択します。
CDC の設定はこれだけで、あとは通常と同じようにタスク追加を行います。タスクタブから「タスクを追加」ボタンを押し、レプリケーションしたいテーブルを選択し、タスクを追加します。
ジョブ実行
追加したタスクを実行すると初回連携は通常通り全件連携されます。2回目以降から変更データキャプチャを利用した連携になります。試しに次のようなレコードを初回連携した後に、
Dataverse / Dynamics 365 側で新たに取引先顧客B, 取引先顧客C のレコードを作成して再度タスクを実行してみます。
すると差分のみ連携成功して2件取り込むことができました。
次に先ほど作成した取引先顧客C のレコードを削除してみて、再度タスクを動かしてみると成功して1件取り込めました。
さらに連携先のテーブルを確認すると、削除したレコードの_cdatasync_deleted カラムがtrue になっていることが確認できます。
この_cdatasync_deleted カラムの情報によりレコードが削除されたのを連携先テーブルでも検出できるようになりました。
CDC で取得できないテーブルの挙動
事前確認した[変更を追跡]のチェックがついていないテーブルに対してタスク実行した場合はどのようになるでしょうか。実際にタスク実行をしてみると、以下のようなエラーが出て連携に失敗してしまいます。
[0] Failed to read data from source, error: The change tracking feature is not supported for the [{{テーブル名}}] table.
このようなテーブルに対しては該当のテーブルの[変更を追跡]のチェックを付与する、付与ができなければ、Standardタイプのジョブを作成して連携する必要があることに注意してください。
補足:差分データ取得のStandard モードとの比較
連携カラム
Standard モードと比較するとCDC では連携されているカラムが少し異なります。具体的には、CDC連携時のみに以下のカラムが追加されます。
- NextDeltaToken:@odata.etag + '!' + 連携日時文字列(MM/dd/yyyy HH:mm:ss)からなる文字列(連携日時はGMT)
- _cdatasync_deleted:レコード削除されたら true
一方でStandard モードでの連携時の場合は、CDC と比較すると以下のカラムが追加されます。
-
Etag : "W/{{versionnumber}}"からなる文字列
補足:連携タイミング間の新規作成 → 削除時の挙動
Sync のジョブ初回実行 → Dataverse / Dynamics 365 でレコード新規作成 → 新規作成したレコードを削除 → Sync のジョブ2回目の実行
という処理の流れがあったとき、連携先のテーブルにはレコードが連携されるでしょうか。結論としては連携先には何のレコードも連携されません。2回目のジョブ実行時のDataverse / Dynamics 365 のAPI レスポンスには次のような該当レコードID が削除されたという値しか含まれず、新規作成時の情報が含まれていないためです。
{
"@odata.context": "https://{{ORGANIZATION_URL}}/api/data/v9.0/$metadata#accounts/$delta",
"@odata.deltaLink": "https://{{ORGANIZATION_URL}}/api/data/v9.0/accounts?$deltatoken=20161912%2107%2f19%2f2024%2004%3a35%3a29",
"value": [
{
"@odata.context": "https://{{ORGANIZATION_URL}}/api/data/v9.0/$metadata#accounts/$deletedEntity",
"id": "03e37710-8845-ef11-bfe2-6045bd690a32",
"reason": "deleted"
}
]
}
おわりに
CData Sync V24.2 では今回ご紹介した機能以外にも多数アップデートされていますので、ぜひこの機会にお試しください。
CData Sync | ノーコードで始めるETL / ELT パイプライン
関連コンテンツ