活動・Chatter・Fileのデータ移行について

活動のデータ移行について

Activity(EventおよびTask)はWhoIdおよびWhatIdによってレポートと紐づいている。従って、WhoIdやWhatIdをUpdateすれば、別のレコードへの紐づけが可能。

なお、任意のカスタムオブジェクトはObjectManager>Detailsの「Allow Activities」チェックボックスをTRUEにすることで、ActivityのWhatIdの参照先となることが可能。

Chatterのデータ移行について

ChatterはFeedItemオブジェクトのParentId項目においてレコードと紐づいている。Chatter投稿に対する返信は、FeedCommentレコードとして作成され、添付ファイルやいいねはそれぞれFeedAttachmentとFeedLikeレコードとして記録される。

オブジェクト構造としては以下の通り。

これらのオブジェクトのParentId項目については、Update処理が仕様上不可能である。

従って、データ移行時には既存のレコードを全てDeleteし、ParentId項目が書き換えられた各レコードをInsertする必要がある。

Fileのデータ移行について

レコードに添付されたファイルとレコードの紐づけはContentDocumentLinkオブジェクトのLinkedEntityId項目においてなされている。

ただし、仕様上の注意点が二つある。

  1. ContentDocumentLinkオブジェクトのLinkedEntityId項目はUpdate不可
  2. ContentDocumentLinkオブジェクトはSOQLにWhere句でId指定することは必須

上述のような仕様からデータ移行は下記の手順を取ることとなる。

  1. データ移行用のSFレコードidの対応表を作成(CSV上で、既存のSFレコードIdの列の横に新しい移行先レコードのSFレコードIdが記載されているイメージ)
  2. 下記のようなApexを用いて、既存のContentDocumentLinkレコードを一括Export
  3. ExportしたContentDocumentLinkレコードのLinkedEntityId項目を対応表に基づいて書き換え
  4. 書き換えた後のcsvをデータローダで投入(Insert)
List<Contentdocument> ContentDocumentList = [SELECT id from Contentdocument];
Map<Id, Contentdocument> cdlmap = new Map<Id, Contentdocument>(ContentDocumentList);
String csv = 'Id,ContentDocumentId,LinkedEntityId\n';
List<Contentdocumentlink> ContentDocumentLinkList = [Select Id,ContentDocumentId,LinkedEntityId FROM ContentDocumentLink Where ContentDocumentID =: cdlmap.keyset()];
	for(ContentDocumentLink conlink : ContentDocumentLinkList){
		csv += conlink.id + ',' + conlink.ContentDocumentId + ',' + conlink.LinkedEntityId + '\n';
	}
ContentVersion file = new ContentVersion(
  title = 'contentdocumentlinks.csv',
  versionData = Blob.valueOf( csv ),
  pathOnClient = '/contentdocumentlinks.csv'
);
 
insert file;
System.debug( file );

Salesforce

Posted by regardie