活動のデータ移行について
Activity(EventおよびTask)はWhoIdおよびWhatIdによってレポートと紐づいている。従って、WhoIdやWhatIdをUpdateすれば、別のレコードへの紐づけが可能。
なお、任意のカスタムオブジェクトはObjectManager>Detailsの「Allow Activities」チェックボックスをTRUEにすることで、ActivityのWhatIdの参照先となることが可能。
※アーカイブ済みの活動についても移行する必要があるため、データローダでのデータ出力時はExportではなくExport Allを利用すること。
Chatterのデータ移行について
ChatterはFeedItemオブジェクトのParentId項目においてレコードと紐づいている。Chatter投稿に対する返信は、FeedCommentレコードとして作成され、添付ファイルやいいねはそれぞれFeedAttachmentとFeedLikeレコードとして記録される。
オブジェクト構造としては以下の通り。
これらのオブジェクトのParentId項目については、Update処理が仕様上不可能である。
従って、データ移行時には既存のレコードを全てDeleteし、ParentId項目が書き換えられた各レコードをInsertする必要がある。
Fileのデータ移行について
レコードに添付されたファイルとレコードの紐づけはContentDocumentLinkオブジェクトのLinkedEntityId項目においてなされている。
ただし、仕様上の注意点が二つある。
- ContentDocumentLinkオブジェクトのLinkedEntityId項目はUpdate不可
- ContentDocumentLinkオブジェクトはSOQLにWhere句でId指定することは必須
上述のような仕様からデータ移行は下記の手順を取ることとなる。
- データ移行用のSFレコードidの対応表を作成(CSV上で、既存のSFレコードIdの列の横に新しい移行先レコードのSFレコードIdが記載されているイメージ)
- 下記のようなApexを用いて、既存のContentDocumentLinkレコードを一括Export
- ExportしたContentDocumentLinkレコードのLinkedEntityId項目を対応表に基づいて書き換え
- 書き換えた後の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 );