Heroku Connect でのオブジェクト関係の処理
最終更新日 2022年12月12日(月)
複数の種類の関係をオブジェクト間に設定できます。この記事では、Salesforce にデータを書き込むときに Heroku Connect でこれらの関係を処理する方法について説明します。
Salesforce ID を使用した単純な関係
単純な関係は 2 つの手順で作成できます。最初の手順は親レコードの挿入です。2 番目の手順は、親への参照を持つ子レコードの挿入です。
Salesforce のネイティブの関係フィールドでは、外部レコード由来の 18 文字の一意レコード ID を使用します。ID がわかっている場合、いつでも Postgres データベースから関係を作成できます。レコードを挿入した後、18 文字の ID が sfid
フィールドに設定されます。親レコードの sfid
が null でなければ、INSERT または UPDATE ステートメントを使用して既存のレコード間の関係を確立できます。
たとえば、Salesforce の標準 Contact オブジェクトには、AccountId
フィールドを介した Account オブジェクトへの参照があらかじめ定義されています。Account レコードを挿入するには、次のようにします。
INSERT INTO salesforce.account (name, description)
VALUES ('My new account', 'Very important account.')
(id
が1234 の) レコードが Salesforce に伝播し、レコードに割り当てられた Salesforce ID が Connect によって sfid
フィールドに書き込まれます。これ以降、18 文字の sfid
値と AccountId
フィールドを使用して関係を確立できます。
INSERT INTO salesforce.contact (firstname, lastname, accountid)
SELECT 'John', 'Smith', sfid
FROM salesforce.account where id=1234;`
この方法はほとんどのケースで機能しますが、Account と Contact を同時に挿入する場合には不便です。両方を同時に挿入する方法について、次のセクションで説明します。
2 つのオブジェクト間の単純な関係と関係外部 ID
Salesforce ID を使用すればうまく機能することは確かですが、Heroku Connect または Salesforce API を使用する場合は煩雑です。最初の挿入の Salesforce ID を待機せずに 2 番目の挿入を行うよう、両方の挿入をセットアップするのが理想的なアプローチです。
子レコードの挿入では、親の外部 ID を介して親レコードを参照できます。Heroku Connect では、親の外部 ID を使用するように設定された追加の関係フィールドを子レコードにマップすることができます。親レコードに複数の外部 ID がある場合、一意識別子として設定されているものを使用します。
たとえば、External_ID__c
という名前の外部 ID フィールドを Account オブジェクトに設定したと仮定します。Contact には、AccountId
フィールドを介した Account への標準参照があります。Contact のマッピングの作成/編集ページで、関係フィールド Account__External_ID__c
を追加して、2 つの手順でこの参照を設定します。
INSERT INTO salesforce.account (name, description, external_id__c)
VALUES ('My new account', 'Very important account.', gen_random_uuid());
前の挿入でプライマリキー id
を取得したと仮定して、次のように Contact
レコードを挿入します。
INSERT INTO salesforce.contact (firstname, lastname, account__external_id__c)
SELECT 'John', 'Smith', external_id__c
FROM salesforce.account where id=1234;
生成されたトリガーログエントリが Heroku Connect で処理されると、この関係が Salesforce で正確に設定されるようになります。
2 つのオブジェクト間の循環参照
マージ書き込みアルゴリズムを使用する場合、関係の外部 ID フィールドとの間で循環参照を確実に達成することはできません。代わりに、「Salesforce ID を使用した単純な関係」で説明したように、18 文字の Salesforce ID を使用します。
循環参照は、2 つのものが互いに参照し合う場合に発生します。たとえば、Account から、そのアカウントのプライマリ連絡先への参照を定義する方法は次のようになります。
Salesforce で、プライマリ連絡先 (primary_Contact__c
) を指すフィールドを Account オブジェクトに追加します。
Salesforce で、ext_id__c
という名前の外部 ID フィールドを Contact オブジェクトに追加します。
Heroku Connect で Account のマッピングを編集して、関係フィールド primary_Contact__r__Ext_ID__c
をマップします。このフィールドを使用して循環関係を設定できます。
前のセクションの Contact の例で、その INSERT ステートメントの間に設定された ext_id__c
フィールドがあると仮定します (ext_id__c
= 4321)。次の SQL スニペットは、循環関係を設定します。
UPDATE salesforce.account set primary_contact__r__ext_id__c = c.ext_id__c
FROM salesforce.contact AS c where c.id = 4321 and salesforce.account.id = 1234;
自己参照関係
マージ書き込みアルゴリズムを使用する場合、関係の外部 ID フィールドを使用して自己参照関係を確実に設定することはできません。代わりに、「Salesforce ID を使用した単純な関係」で説明したように、18 文字の Salesforce ID を使用します。
自己参照関係は、参照先が同じオブジェクト内の別のレコードである、循環参照の特殊なケースです。Salesforce では、同じオブジェクトの親を参照する子レコードを 1 つの SOAP CREATE メッセージでは挿入できません。自己参照は元の挿入ではなく後続の更新で行われる必要があります。
Account オブジェクトには、別の Account を参照する ParentID
フィールドがあります。Parent__External_ID__c
フィールドをマップし、それを使用して、子の Account レコードとその親の間に関係を確立することができます。このように、挿入を使用して 2 つの Account レコードを作成できます。
1.
INSERT INTO salesforce.account (name, description, external_id__c)
VALUES ('My new account', 'A very important account', gen_random_uuid());
ステートメントによって挿入されるアカウント行には id
列が含められ、これは自動インクリメントされる整数列であり、テーブルのプライマリキーの役目を果たします。この列は sfid
列とは異なり、データベース固有の列であって、Salesforce の一部ではありません。このケースで、id
列の自動生成された値が 1234
であるとします。
2.
INSERT INTO salesforce.account (name, description, external_id__c)
VALUES ('Child of My new account', 'Sub account of 1234', gen_random_uuid());
挿入された行に id
列が含められ、自動生成された値が今度は 1235
であると仮定します。
最初と 2 番目の INSERT ステートメントから id
の値を取得して、関係を確立します。
UPDATE salesforce.account AS c set parent__external_id__c = p.external_id__c
FROM salesforce.account AS p WHERE p.id = 1234 AND c.id = 1235;
ポリモーフィックな関係
ポリモーフィックな関係とは、参照されるオブジェクトが複数の異なるオブジェクトの種類のいずれかである可能性がある関係のことです。たとえば、Event オブジェクトは、"What" のポリモーフィックな関係を通じて Account、Campaign、または Opportunity と関係する可能性があります。Salesforce では、ポリモーフィックな関係における関係先オブジェクトを、オブジェクト ID とオブジェクトの種類によって識別できます。Heroku Connect でポリモーフィックな関係を作成するには、「Salesforce ID を使用した単純な関係」で説明した 18 文字の Salesforce ID を使用します。
Heroku Connect では、ポリモーフィックな関係のための外部 ID のマッピングはサポートされていません。マッピングを作成および編集するとき、What および Who のポリモーフィック関係フィールドについては、外部 ID 関係は利用できません。