Salesforceのデータ移行で問題となってくるのが、Lookup(参照項目)項目に入っているオブジェクトIDの扱い。
SalesforceにおけるオブジェクトIDの概念と、それをどのように参照しているかを理解していないと、参照項目を含んだオブジェクトを扱うときに思わぬ苦労をすることになります。
この記事では、オブジェクトIDと参照項目、そして、それらの移行を便利にする外部IDの使い方について説明したいと思います。
オブジェクトIDと参照項目って何?
Salesforceでは、各オブジェクトに対して、組織内の全オブジェクトでユニークなオブジェクトIDという18桁の文字列が割り振られます。
これらのIDは、そのオブジェクトが生成された時に採番されるため、画面からオブジェクトを作成したときや、データローダーでデータをロードした時に割り当てられ、その前に知ることはできません。
また、同じデータを別々の組織にロードした場合、オブジェクトIDは各組織で採番されるので、例えば同じ担当者コードを持っていたとしても、それらのオブジェクトIDは各組織で異なります。
また、各オブジェクトで参照(Lookup)項目を持っていた場合、それらの項目には、実際にはこの「オブジェクトID」が入っています。
上記の例でいうと、担当者オブジェクトの「取引先」の参照項目にはそれぞれの組織の取引先のオブジェクトIDが入っていることになるというわけです。
参照項目を移行するには?
ロード時にしかわからない参照項目を含んだオブジェクト「担当者」を移行するにはどうすればいいでしょうか。方法は大きく2つあります。
この方法は、初めに取引先マスタをロードし、オブジェクトIDが振られた後、いったんエクスポートして、取引先IDからオブジェクトIDを割り当ててから、担当者マスタを取引先のオブジェクトID付きでロードします。
DBを使うのでああれば担当者IDでJoin、エクセルを使うのであれば、VLookupなどの関数を使用することになります。
Salesforceでは、参照項目にオブジェクトIDを埋め込まなくても、ロード時にオブジェクトIDを名前解決してくれる非常に便利な仕組みがあります。つまり、上記の例でいうと、担当者マスタの項目「取引先」に取引先ID(AC-002等)を割り当てれば、ロード時に、「00128000008UYmSAAW」または「00127781066EZePIEQ」といったそれぞれの組織のオブジェクトIDに変換してロードしてくれるということです。
これって、考えてみると画期的なことで、方法①だと本番とSandboxで異なるオブジェクトIDを扱わなくてはいけなかったのが、どちらも同じマスタを管理していればいいことになります。
外部IDを使ったマスタ管理方法
それでは、早速、外部IDを使ったマスタ管理を行ってみましょう。最初は少し迷うかもしれませんが、慣れるとそれ無しではいられなくなりますよ!
外部IDは、通常外部システムで持っているようなIDです。例えば取引先IDや商品IDなど、マスタでキーとなるような項目であることが多いです。ユニークである必要はありませんが、その性質上、ユニークであることが多いと考えられます。
では、外部IDを定義すると何が便利になるでしょうか?以下の図をよく見てください。
外部IDはデータローダーやほかのツールでデータをロードするときのUpsertのキーとして指定できます。オブジェクトIDではなく、外部ID項目として指定した取引先IDや商品IDをキーにすれば、組織に依存しないマスタ管理ができますよね。
これ、すごく便利です。
例えば取引先マスタに外部キー「取引先ID」を設定して、データをロードしておきます。
次に、担当者をロードするときには、「取引先への参照」の項目には「オブジェクトID」ではなく、「取引先ID」を設定します。
そして、ロード時の指定で、「取引先」の参照の名前解決に「取引先ID」を指定すると、データがロードされた際に、そのオブジェクトIDをセットしてくれるということです。(外部IDとして定義しておかないと、この指定はできません。)
では、次回は実際に外部IDを定義し、それを利用したデータ移行、マスタ管理を行っていきましょう。