You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Salesforce中获取指定日期后变更的所有对象及实现联系人数据增量同步(含删除处理)

嘿,这个问题我太熟悉了!Salesforce专门提供了几种机制来搞定增量同步,完全不用每次全量拉取数据,效率提升不是一星半点。咱们逐个解决你的问题:

1. 仅获取上次同步后变更的联系人(每小时任务)

有两种主流方案,看你的需求复杂度选:

方案一:用SOQL过滤LastModifiedDate

这是最直接的方式,适合轻量的定时同步。每小时跑任务时,直接查询过去1小时内修改过的联系人:

SELECT Id, Name, Email, Phone, ... FROM Contact 
WHERE LastModifiedDate >= LAST_N_HOURS:1

这个查询会包含新创建已更新的联系人,但注意:它不会返回被删除的记录——这就是你第二个问题要解决的点。

方案二:Change Data Capture(CDC)

如果需要更可靠的变更捕获(包括删除、字段历史等),CDC是Salesforce官方推荐的增量同步方案。步骤大概是:

  1. 在Salesforce Setup里,找到「Change Data Capture」,启用Contact对象的变更事件订阅。
  2. 你的同步服务可以通过订阅这些事件(比如用REST API、Apex触发器或者第三方工具),实时或定时拉取过去1小时的变更事件,里面会包含创建、更新、删除的记录详情。

CDC的优势是能捕获所有类型的变更,包括一些SOQL可能漏的细节(比如字段级的修改历史),适合中大型同步场景。

2. 处理已删除的联系人

确实,普通的SOQL查不到删除的记录,得用专门的API或者CDC:

GetDeleted API

这个API专门返回指定时间段内被软删除的记录ID。你可以在每小时同步时,调用这个API(传入上一次同步结束时间到当前时间的区间),拿到这段时间删除的联系人ID,然后在你的本地数据库里标记删除或者直接移除这些记录。

如果是硬删除(比如用户清空了回收站),GetDeleted就查不到了,这时候可以用Query All API,加上过滤条件:

SELECT Id FROM Contact 
WHERE IsDeleted = true AND LastModifiedDate >= LAST_N_HOURS:1

不过硬删除的记录会在Salesforce里保留一段时间后彻底清除,所以要确保同步任务频率足够高。

用CDC捕获删除事件

如果已经启用了CDC,删除事件会被自动捕获,事件里的ChangeEventHeader.changeType会标记为DELETE,你可以直接从事件数据里拿到被删除的记录ID,一起处理。

3. 获取指定日期后变更的所有对象

如果要批量处理多个对象的增量数据,有这几种思路:

  • 逐个对象处理:对每个需要同步的对象,分别用LastModifiedDate过滤SOQL查询(获取创建/更新),再调用对应的GetUpdatedGetDeleted API(GetUpdated返回指定时间段内更新/创建的记录ID)。这种方式简单直接,适合对象数量不多的场景。
  • Query All批量查询:如果想一次性处理多个对象,可以用Query All API(它能返回已删除的记录),对每个对象加上LastModifiedDate >= [指定日期]的过滤条件,同时通过IsDeleted字段区分正常记录和删除记录。不过要注意,这种方式对大数据量的对象可能会有性能问题,建议分页查询。
  • CDC批量订阅:如果用CDC,可以一次性订阅多个对象的变更事件,然后统一拉取指定日期后的所有变更事件,这种方式更高效,适合需要同步大量对象的场景。
一些额外注意事项
  • 时区问题:Salesforce的日期时间字段都是基于UTC的,你的同步任务要注意转换时区,避免因为时区差漏拉或多拉数据。
  • 速率限制:Salesforce的API调用有速率限制,定时同步任务要控制调用频率,避免触发限制。
  • 软删除的时效性:软删除的记录会在回收站保留15天(默认),之后会被硬删除,所以要确保同步任务在这个周期内至少跑一次。

这些方案里,轻量同步用SOQL+GetDeleted就足够;如果需要更全面的变更捕获,CDC是首选。根据你的业务规模和需求选就行!

内容的提问来源于stack exchange,提问作者Chris

火山引擎 最新活动