1. Audit Field迁移
Audit Field包括,CreatedByID,CreatedDate,LastModifiedbyID,LastModifiedDate。
- 为了保证这些字段和原始系统一致,需要创建Permission Set,给数据管理员开通权限,参考Enable the 'Create Audit Fields' permission
- 需要创建自定义字段:LastModifiedbyID of old org,LastModifiedDate of old org,记录原始系统的最后修改时间和人的信息。在导入增量的时候,会被覆盖。
- 部分对象不支持导入Audit Feild, 如 Price Book,Campaign,Campaign Member等。
2. Id 和 Owner
salesforce 18位Id 是否无法做到新旧环境一致的。新环境中会产生新的Id。
- 创建 Id of old org,并标记为external,很重要,未来更新增量的时候,会用到该字段。
- 创建Owner of old org,记录旧环境中Owner的 18位 Id。
- 导入模版中无法通过__r的方式关联到Owner。需在数据导入前增加owner 列,vlookup 出新环境的owner Id。
3. 关联关系字段
像 Opportunity上关联了Account,Contact上关联了 Account等情况。
- 为了方便校验关联关联系的准确性,需要为关联关系的字段创建Id of old Org ,如 AccountId of old org 。
- 制定导入模版的时候,关联字段的csv列名,可以写成__r.Id_of_old_org__c. 如 Opportunity上关联Account Id,可以写成,Account.Id_of_old_org__c, Createdby.Id_of_old_org__c等,详细参考Relationship Fields in a Header Row
4. Auto Number, Name
为了保证新旧环境Auto Number,和Auto Number 类型的Name数据一致。
- 导入前将对应字段类型修改为文本。
- 批量修改为Auto Number时,需要再Field或者Object的metadata中增加startingNumber的参数。
- Case Number不支持改成文本,不支持修改stratingnumber。
Custom Field Metadata:
<?xml version="1.0" encoding="UTF-8"?>
<CustomField xmlns="http://soap.sforce.com/2006/04/metadata">
<fullName>XX__c</fullName>
<displayFormat>{0000000}</displayFormat>
<externalId>true</externalId>
<label>XXX</label>
<trackHistory>false</trackHistory>
<type>AutoNumber</type>
<startingNumber>80000</startingNumber>
</CustomField>
Object Metadata:
<nameField>
<displayFormat>XXX-{000000}</displayFormat>
<label>Case Number</label>
<trackHistory>false</trackHistory>
<type>AutoNumber</type>
<startingNumber>8000</startingNumber>
</nameField>
5. default value
default value对数据迁移的准确性影响很大,尤其是中途增加了字段,设置了default value,导致历史数据该字段为空,新创建的数据有值。导入新系统的时候,会造成历史数据该字段有值。对于formula字段引用该字段进行运算的,会有很大的影响。
- 方案1,在Metadata中移除default value的配置。待数据迁移完成后,重新导入。
- 方案2,记录有default value的字段,并在导入数据的时候,字段为空的替换为#N/A。导入增量的时候,就不要重复考虑这个事情了。
6.长文本数据处理
Case,EmailMessage等有长文本的对象,处理起来很复杂,常常超过excel的单元格的最大长度,导致文件无法打开。有的时候,即使能打开也是混乱的。由于长文本的存在导致文件过大,超过API的限制。
- 导出的时候,不导出长文本字段。待创建完成后,在更新到系统中。保证audit field的完整性。
- 缩小导出文件的大小:分时段导出,如:CALENDAR_YEAR(createddate) = 2022 and CALENDAR_MONTH(createddate) in (1,2,3)
7.大数据量
如果单个对象的数据导出文件超过150M(API limitaion),则需要手动拆分,或者根据时间段多次导出。
- 手动拆分:使用文本编辑器10万条一个文件。
- 缩小导出文件的大小:分时段导出,如:CALENDAR_YEAR(createddate) = 2022 and CALENDAR_MONTH(createddate) in (1,2,3)
8. 数据导出,导入和顺序
- 分析系统中数据的关联关系,首先导入无依赖的数据,然后导入有依赖的数据。如:
1.Customer Setting
2.User
3.Account
4.Opportuntiy
- 分析系统中每个对象的字段,移除formula字段,整理为导出SQL语句,形成文档,配置批量导出工具的时候会用到。
- 分析对象的依赖关系,制定导入导出文件的列名,以便导入时,自动关联对应的数据,形成文档。
如导出文件的列名为:Id,Name,CreatedbyId,AccountId.
如导入文件的列名为:Id,Name,Createdby.Id_of_old_org__c,AccountId.Id_of_old_org__c
9.审批记录历史,字段变更历史
审批记录的系统表,和字段变更历史的系统表都是只读的。所以需要考虑其他方案。
- 可以在对象上创建一个长文本字段,将审批历史以JSON串的形式保存到对象。创建一个组件展示审批历史和字段变更历史。并判断记录审批历史或字段变更历史的字段不为空的时候显示该控件。
- 创建新的表记录审批历史和字段变更历史,并lookup到对应的对象上。这个方案比较简单,并且工时最小。
10.审批中的数据
从setup,mass transfer approval中获取审批中的数据。向业务同事确认状态,将历史数据处理掉。需要迁移的数据,可以通过apex代码初始化提交。
11.attachment file
附件和文件的量比较大,需要评估下载时间和上传时间。
- 下载速度一般4m每秒。一天10G左右。可以通过自研下载工具,dataloader, export data等方式下载数据。一般以18位id作为文件夹名称。
- 使用dataloader上传,size=2,不能使用bulk API,需要使用最新版本的dataloader,大于61。上传文件的格式可以参考文档。
12.数据校验
数据量和数据的准确性。
- 数据量,通过data storage确认环境数据量。
- 数据准确性,vlookup字段,formula字段。确认需要验证的字段,形成sql,并根据name或createddate排序,使新旧环境的数据条数一一对应。而后使用pandas工具对比,文件不能太大。