Mark Hammer's blog

SalesforceやTrailheadに関する情報を投稿しているブログです。

フィード追跡から大量データのリカバリをやってみた

はじめに

Salesforceにて項目値の変更を記録する機能は項目履歴管理フィード追跡がありますが、データローダから簡単に項目値の変更履歴をエクスポートできる項目履歴管理と違い、フィード追跡は容易に変更履歴をエクスポートすることができません。
今回は項目履歴管理が使えず、フィード追跡から大量データのリカバリが必要になった場合の手順を記載します。

f:id:mark-hammer:20190602222948p:plain
画面では簡単に更新内容が分かるのに…

状況

  • ある日、特定日時に大量の取引先責任者レコードにある「取引先」項目値が削除されていることに気づいた。
  • 項目履歴管理は使用しておらず、デフォルトで設定されていたフィード追跡により各レコードに取引先名変更のChatter投稿がなされていた。
  • そのChatter投稿をもとに手作業でリカバリすることはできるが、対象レコードが数千件存在するため、データローダ等で一括リカバリしたい。

フィード追跡からのリカバリが難しい理由

項目履歴管理の場合はリカバリに必要な「対象レコードID」「変更前の値」「変更後の値」が1オブジェクトで取得可能です。

取引先責任者履歴のイメージ図

一方、フィード追跡の場合、

  • 「対象レコードID」と「該当フィード追跡の投稿を示すChatter投稿ID」を持つフィード項目(FeedItem)
  • 「該当フィード追跡の投稿を示すChatter投稿ID」と「変更前の値」「変更後の値」を持つフィード追跡履歴(FeedTrackedChange)

が別オブジェクトとなっているため、リカバリにはこの2オブジェクトの紐づけが必要となります。

f:id:mark-hammer:20190603234213p:plain
フィード追跡関連オブジェクトのイメージ図

これがフィード追跡からのリカバリを難しくしている一方で、この紐づけさえできればフィード追跡からでもリカバリはできる、ということになります。

リカバリ手順

データのエクスポート

フィード追跡からのリカバリに必要な2オブジェクトのうち、FeedTrackedChangeはウィークリーエクスポートから、FeedItemはデータローダからのExportが必要となります。

ウィークリーエクスポート

Salesforce からバックアップデータをエクスポートする のヘルプに従いエクスポートを実行します。
「エクスポートデータ」で選択するオブジェクトは、今回は FeedTrackedChange だけでよいです。*1
「画像、ドキュメント、および添付ファイルを含める」、「Salesforce Files および Salesforce CRM Content ドキュメントバージョンを含める」はお好みで選択してください。画像ファイルが多いとバックアップに時間がかかるので、画像、ドキュメント、添付ファイルのバックアップがとりたい方以外は不要だと思います。

f:id:mark-hammer:20190602225429p:plain
ウィークリーエクスポート 選択画面

エクスポートが完了するとzipファイルがダウンロードできるようになるので、ダウンロードして解凍し、FeedTrackedChange.csvが存在することを確認します。

データローダ

Chatter フィードのデータをエクスポートする のヘルプに従い「フィード項目 (FeedItem)」オブジェクトをエクスポートします。
以下、エクスポートしたファイル名をFeedItem.csvとします。

f:id:mark-hammer:20190602225346p:plain
データローダ Export画面

データリカバリー用CSVファイル作成

「データのエクスポート」で取得したデータの内容は以下です。(今回の作業に必要な項目のみ抜粋)

  • FeedTrackedChange.csv
    • FeedItemId: フィード追跡の投稿を示すChatter投稿ID
    • FieldName: 値が変更された項目のAPI参照名。取引先責任者オブジェクトにある「取引先」項目の場合は"Account"。
    • DataType: 変更された項目の型。文字列の場合は"TEXT"、参照関係の場合は"EntityId"。「取引先」項目のフィード追跡では、取引先名のうちテキスト分の"TEXT"、取引先レコードID分の"EntityId"と、2レコード作成されます。
    • OldValueString: (「取引先」項目の場合)変更前のレコードID
    • NewValueString: (「取引先」項目の場合)変更後のレコードID
    • OldValueLastName: (「取引先」項目の場合)変更前の取引先名
    • NewValueLastName: (「取引先」項目の場合)変更後の取引先名
  • FeedItem.csv
    • ID: Chatter投稿ID
    • PARENTID: Chatter投稿がどのレコードに投稿されたかを示すレコードID(取引先責任者の場合は"003"から始まる)。Chatter投稿がフィード追跡の場合は、値が変更されたレコードのIDを指す。
    • TYPE: Chatter投稿の種類。フィード追跡の場合は"TrackedChange"。

ここで、FeedTrackedChange.csvのFeedItemIdとFeedItem.csvのIDが同じ場合、その行は同じフィード追跡のChatter投稿の内容を指しています。
なので、FeedTrackedChange.csvのFeedItemIdとFeedItem.csvのIDで突合せを行い、一致するFeedItem.csvのPARENTID(=対象レコードID)とFeedTrackedChange.csvのOldValueString(=対象レコードの変更前の値)を取得できれば、データリカバリー用CSVファイルを作成できます。

今回のデータリカバリーに使うCSVファイルに必要な項目、及び対象となるエクスポートデータの項目は以下です。(その他項目はあってもいいですが、インポート時には使いません。)

  • リカバリー対象レコードID
    • FeedItem.csvのPARENTID
  • リカバリーしたい「取引先」項目のレコードID
    • FeedTrackedChange.csvのOldValueString

データインポート

データローダを使用したデータの挿入、更新、または削除 のヘルプを参考に、最初のメニューで"Update"を選択して取引先責任者(Contact)オブジェクトのレコードを更新します。 Step3: Mapping は以下の通り選択します。

Field Column Header Name
(FeedItem.csvのPARENTID部分のヘッダ名) Id
(FeedTrackedChange.csvのOldValueString部分のヘッダ名) AccountId

f:id:mark-hammer:20190602225347p:plain
データローダ Update画面

サンプルを用いた例

ここでは、「取引先責任者レコードIDが"003xxxxxxxxxxx2BBB"の【取引先名】項目が消された」という前提とします。 この場合、FeedTrackedChange.csv、FeedItem.csvは以下のようになります。(IDはサンプル、不要項目は省略)

  • FeedTrackedChange.csv
ID PARENTID TYPE
0D5xxxxxxxxxxx1AAA 003xxxxxxxxxxx2BBB TrackedChange
  • FeedItem.csv
FeedItemId FieldName DataType OldValueString NewValueString OldValueLastName NewValueLastName
0D5xxxxxxxxxxx1AAA Account Text サンプル取引先
0D5xxxxxxxxxxx1AAA Account EntityId 001xxxxxxxxxxx3CCC

上記データから、「取引先責任者レコードIDが"003xxxxxxxxxxx2BBB"の【取引先名】項目が【サンプル取引先】(ID:001xxxxxxxxxxx3CCC)から空データになった」ことが分かります。
ここから、リカバリー対象レコードIDであるFeedItem.csvのPARENTID(="003xxxxxxxxxxx2BBB")とリカバリーしたい「取引先」項目のレコードIDであるFeedTrackedChange.csvのOldValueString(="001xxxxxxxxxxx3CCC")を取り出し、以下のRecoveryData.csvを作成します。

  • RecoveryData.csv
    • ヘッダ名はデータローダでの取引先責任者Updateに使用する項目に合わせています。
Id AccountId
003xxxxxxxxxxx2BBB 001xxxxxxxxxxx3CCC

このRecoveryData.csvを使って、データローダで取引先責任者へのUpdateを実施します。

おわりに

今回は項目履歴管理が使えない状況でデータリカバリをしてみましたが、項目履歴管理が使えればデータローダからのExport1回でリカバリが可能になるため、項目履歴管理 のヘルプを参考に項目履歴管理の設定をすることを強くお勧めします。

*1:が、バックアップも兼ねて「すべてのデータを含める」を選択することを強くお勧めします。