Which Records in Trigger.new Should Be Considered?

DEX450 - Module 14: Trigger Design Strategy

📄 第 373 页 🎬 视频课程

课程章节介绍

让我们来聊聊在Salesforce的触发器(Trigger)中,如何有效地处理`Trigger.new`中的记录。特别是当我们想要查询和过滤认证尝试记录时,应该注意哪些关键点。 首先,`Trigger.new`包含了触发器触发时所有被插入或更新的记录。在这个场景中,我们关注的是认证尝试记录。我们的目标是构建一个查询,只检索那些对我们有用的记录,这样可以减少处理的数据量,提高效率。 ### 1. 过滤记录 我们首先可以排除那些状态不是“通过”的认证尝试记录。因为这些记录不会对持有认证的人产生贡献。所以,我们的查询应该只包含那些状态为“通过”的记录。 ### 2. 检查记录是否刚刚获得“完整/通过”状态 如果触发器是在记录更新时触发的,我们需要确定哪些记录是刚刚获得“完整/通过”状态的。为了做到这一点,我们可以使用`Trigger.old`来查看更新前的记录状态。如果`Trigger.old`中的状态不是“完整/通过”,而`Trigger.new`中的状态是“完整/通过”,那么这条记录就是刚刚获得这个状态的。 ### 示例 假设我们有以下字段: - ,记录ID,:在`Trigger.new`中,这些记录已经有ID,因为触发器是在记录已经插入或更新后触发的(后触发状态)。 - ,候选人ID,:标识尝试认证的候选人。 - ,认证ID,:标识具体的认证。 - ,与认证相关的元素数量,:可能与认证相关的其他元素数量。 - ,尝试状态,:标识认证尝试的当前状态。 ### 查询构建 我们可以构建一个查询,只选择那些状态为“通过”的记录,并且检查这些记录是否刚刚从其他状态变为“通过”。这可以通过比较`Trigger.old`和`Trigger.new`中的状态来实现。 ### 代码示例 ```apex for (Certification_Attempt__c attempt : Trigger.new) { // 检查状态是否为“通过” if (attempt.Status__c == 'Passed') { // 检查是否刚刚获得“通过”状态 Certification_Attempt__c oldAttempt = Trigger.oldMap.get(attempt.Id); if (oldAttempt.Status__c != 'Passed') { // 这条记录刚刚获得“通过”状态 // 在这里添加你的处理逻辑 } } } ``` 通过这种方式,我们可以确保只处理那些真正需要关注的记录,从而提高触发器的效率和性能。希望这个解释对你有帮助!如果有任何问题,随时问我。