【リバースETL】DWHからSalesforceにデータを入れてみる

## はじめに
リバースETLでは、DWHにある分析済みのデータをSalesforceなどのCRMへいれることで現場のユーザーが分析結果を確認しやすい環境を作ることができます

https://blog.trocco.io/glossary/reverse-etl

試しにTROCCOでリバースETLの設定してみたところ、思いの外Salesforce側の設定などに手間取りました。
今回は詰まったところや、発生したエラーなどをまとめていきたいと思います。

## 今回のゴール
DWHにあるデータをSalesforceのカスタムオブジェクトにいれる

## やること
①Salesforceのカスタムオブジェクトを作成する
②TROCCOでリバースETL（Snowflake → Salesforce）の設定をする
③Salesforceで転送されたデータを確認する

## ①Salesforceのカスタムオブジェクトを作成する
Snowflakeに下記のようなデータがあります。
これをSalesforceで確認できるようにするため、器となるカスタムオブジェクトを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/8964a0f2-00d0-4ded-acab-854b00540770.png)

カスタムオブジェクトはSalesforceの設定にあるオブジェクトマネージャから作成できます。

![スクリーンショット 2025-04-02 155120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/ccdb53ec-5035-4bf7-af3e-b809cc8ac69f.png)

作成したカスタムオブジェクトが下記です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/adb283d1-4f6a-4a17-bc89-14edb5e38782.png)

::: note info
API NAME は **transaction_data** で作成しました。
カスタムオブジェクトの場合は自動で末尾に **__c** が付与されるようです。
:::

さらに、カスタムオブジェクトの中にカスタムフィールドを作成していきます。
とりあえず必須項目だけ設定します。

![スクリーンショット 2025-04-02 160950.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/c403f638-56d2-4e2a-906c-95cf31db1e04.png)

作成したフィールドが下記です。DWHのカラム名とフィールド名は同じものにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/5c4ce4f4-4bde-4564-ba4a-d19acb11b3b1.png)

Salesforce側の設定はできたかな？と思ったので、TROCCOの設定を行います。

## ②TROCCOでリバースETL（Snowflake → Salesforce）の設定をする
入れ物ができたので、実際にデータを転送してみます。
リバースETLのときでも設定方法に変わりはなく、GUIでサクサク設定できます。
データ転送設定にて、転送元をSnowflake、転送先をSalesforceとして指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/76c4c2ed-1943-4282-b5f4-57ecdc009aba.png)

STEP1の詳細設定画面では項目に従って設定を進めます。
STEP2のプレビューではこんな感じでデータが確認できます

:::note info
今回はデモ用に適当なデータを使用しているため、レコードのIdを含まないデータで試しています。Salesforceに入れたデータを後から更新したい場合は、対象のレコードを特定するためIdが必要となります。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/1f086ced-11b4-4819-bcd5-2fd9a202f4b3.png)

問題なさそうなので、保存して実行していきます。
結果はエラーになってしまいました...。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/0ad36e73-0336-4394-a4ff-eed646590721.png)

エラー内容を抜粋すると下記になっていました。
```
Session 315379465016086 has been successfully closed in 26 msINFO: Connection with session id: 315379465016086 closed successfully in 27 msThere are 598 failuresINVALID_FIELD: 598 failures No such column 'merchandise' on entity 'transaction_data__c'. If you are attempting to use a custom field, be sure to append the '__c' after the custom field name. Please reference your WSDL or the describe call for the appropriate names.: {"merchandise":"A_001","company_purchased":"F株式会社","settlement_time":"2025/02/01
```

カスタムフィールド名のあとには ```__c``` が必要だと言われているみたいです。
データ転送設定のSTEP2 カラム定義でそれぞれのカラム名に ```__c``` を追加していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/31566f96-23d2-42ce-9745-1d67c11b07dd.png)

この状態で実行すると成功しました！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/a10bb7ca-3e2b-4c50-8629-c047a7628f07.png)

これでデータ転送は完了です！

## ③Salesforceで転送されたデータを確認する
無事Salesforceにデータを転送できました。Salesforce側で結果を確認しようとしたのですが、Salesforce上のタブにレコードを入れた「取引データ」という項目が見つかりません...
転送したデータに含まれるキーワード(株式会社)で検索しても結果に表示されませんでした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/8d945566-20f9-41cc-bd73-c134a6a56223.png)

色々調べたところ、Salesforce上でタブの設定を行う必要があるようです。
設定を開き、ホームで **tab（タブ）** のように検索します。
ユーザーインターフェースに含まれる **Tabs（タブ）** を選択します。

![スクリーンショット 2025-04-04 120915.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/4bf5efba-0a3b-4ffa-82cb-0565ce917b0d.png)

新規作成します。

![スクリーンショット 2025-04-04 121213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/74f5f764-7eed-431d-ac54-4ebeae694246.png)

必須項目を設定して保存します。
すると、このような設定を作ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/b754ab11-5957-4f8d-b6d3-6f20db131620.png)

少し待ってからダッシュボードの方に戻ると、Moreの中に対象の項目が表示されることが確認できました！

![スクリーンショット 2025-04-04 121644.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/0c36bb39-d671-4085-89de-ec56a40af701.png)

また、検索した場合も結果として対象の項目が表示されることが確認できました。

![スクリーンショット 2025-04-04 121958.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/89cd2100-947d-4972-a0ca-6b26d86fd927.png)

Salesforce側の確認も完了したので今回はここまでです！お疲れ様でした

## (おまけ) Salesforce上のレコードを一括で削除する方法
SalesforceではGUI上で一括選択してのレコード削除ができなさそうでした。
設定を失敗して想定外のレコードが大量に転送されてしまった場合や一旦レコードをすべて削除して最初からやり直したい場合は下記の記事に記載の方法が使えたのでご参考までに！

https://qiita.com/Takaa/items/d50c71f9af709f7a2fe4

## おわりに
Salesforce分かりづらすぎて大変でした。
Salesforceの公式ドキュメントは文字での説明が多く初心者には厳しいところがあるので、やってみた記事などのほうが参考になりました。
また、データ転送の設定ではカラム名の設定で躓きました。
一度SalesforceからDWHへデータを転送してみると、どのようなカラム名でどの情報が格納されているのか確認できます。それを参考にすると設定がスムーズに進められたので、適当なデータを手動で入れてみてデータ転送前に確認すると良さそうです。