外部IDを使って追加・更新を判定する Salesforce 「UPSERT」機能の使い方:CData Salesforce Driver

f:id:sugimomoto:20210309203856p:plain

こんにちは。CData Software Japanリードエンジニアの杉本です。

今回は CData Salesforce Driverの知っておくと便利な機能、UPSERT について解説します。

UPSERT とは?

通常 Salesforceのレコードを更新したい場合、事前にレコードのIDを特定する必要があります。

Salesforce の画面上では以下のようにURLで利用されている値で

f:id:sugimomoto:20210309203209p:plain

CData Salesforce Driverでは以下のように取得できる項目です。

f:id:sugimomoto:20210309203216p:plain

このIdを特定した上で、以下のようにUpdateのリクエストを実行できます。

UPDATE Account SET Name = 'Update' WHERE Id = '0010I00002X9bnYQAR';

cdn.cdata.com

しかしながら、外部のRDBからデータを渡したい、みたいな要望がある場合、SalesforceのIdを外部RDB側で保持していない、というケースは多く存在すると思います。

f:id:sugimomoto:20210309204226p:plain

そのため、例えば一度メールアドレスや企業IDなど、外部データとマッチングできる一意のIDでSalesforceのデータを検索し、その結果からSalesforceのIdを特定して、ようやくUpdateを行う、というのが回りくどいアプローチを取らざるを得ません。

ただ、以前にBlogでも紹介したように、SalesforceにはAPI制限があり、レコードの更新のたびにIdを特定しようとすれば、リクエスト数が2倍になってしまうので、簡単にAPI制限を圧迫してしまいます。

www.cdatablog.jp

そこで、活用できるのが、この「UPSERT」の機能です。

このUPSERTを使うことで、Salesforceのオブジェクトに対して、外部で利用している一意のIDを指定し、そのIDが存在すれば更新、存在しなければ追加といった処理を行うことができるようになります!

developer.salesforce.com

cdn.cdata.com

リクエストも一回で済むので、API リクエストの節約にも繋がりますね!

それでは、そんな便利なUPSERTの使い方を解説していきたいと思います。

オブジェクトに外部IDを準備する

まず、Upsert機能を利用するために必要となる外部IDの項目を準備しましょう。

今回は取引先(Account)オブジェクトに外部IDの項目を用意します。

f:id:sugimomoto:20210309203224p:plain

「項目とリレーション」のカスタマイズページに移動して「新規」をクリックし

f:id:sugimomoto:20210309203231p:plain

新しく「テキスト」の項目を追加します。

f:id:sugimomoto:20210309203238p:plain

続いて、項目の設定を行うのですが、ここで重要なのが「外部ID:外部システムの一意のレコード識別子として設定する」のプロパティにチェックを入れることです。

ここで、この項目をUPSERTを行うための外部IDとして利用することができるようになります。

f:id:sugimomoto:20210309203246p:plain

あとは、任意の設定で作成を進めて構いません。

最終的に以下のように項目が追加されました。

f:id:sugimomoto:20210309203254p:plain

UPSERT 文を実行する

それでは、実際に CData Salesforce Driverを使って、UPSERT を試してみましょう。

今回は、CData Salesforce JDBC Driverを利用しました。

www.cdata.com

f:id:sugimomoto:20210309203300p:plain

SQLを実行するツールとして、DBVisualizer を使用しています。

www.cdata.com

早速、DBVisualizer からSalesforceに接続してみると、以下のようにAccountテーブルに追加した項目である「CDataExternalId__c」が追加されていることが確認できます。

f:id:sugimomoto:20210309203308p:plain

データを取得してみると、以下のような状態になっています。

SELECT Id,Name,AccountNumber,CDataExternalId__c FROM Account;

f:id:sugimomoto:20210309203315p:plain

それでは、UPSERTを試してみます。UPSERTの構文は以下のようになります。AccountのName、AccountNumber、そしてCDataExternalId__cを入力する構成としました。

UPSERT INTO Account(Name,AccountNumber,CDataExternalId__c,ExternalIdColumn)
VALUES('UPSERT TEST INSERT','001','UPSERTKEY01','CDataExternalId__c');

cdn.cdata.com

ここでのポイントは外部IDとなる項目を「ExternalIdColumn」という項目で指定することです。

今回は外部IDが「CDataExternalIdc」という項目なので、これをExternalIdColumnの値として指定します。これにより、この項目を一意の判定材料として利用し、CDataExternalIdcに指定した値がSalesforce上に存在すれば更新を行い、存在しなければ追加を行います。

実際に試してみると、以下のようにデータが追加されました。

f:id:sugimomoto:20210309203323p:plain

それでは、再度同じ「CDataExternalId__c」の値でNameの値だけ変更したUPSERTを実行してみましょう。

UPSERT INTO Account(Name,AccountNumber,CDataExternalId__c,ExternalIdColumn)
VALUES('UPSERT TEST ★UPDATE★','001','UPSERTKEY01','CDataExternalId__c');

結果は以下の通りとなり、レコードが追加されず、先程追加したレコードが更新されました。

f:id:sugimomoto:20210309203330p:plain

おわりに

このように、UPSERTは知っておくととても便利な機能です。

外にも様々な便利機能が存在するので、是非ドキュメントを参照してみてください。

cdn.cdata.com

もし、気になる機能やわからないことがあれば、テクニカルサポートまで気軽に質問してみてください。

https://www.cdata.com/jp/support/submit.aspx

トライアル・お問い合わせ

関連コンテンツ