Salesforce 执行顺序(Order of Execution)详解
Salesforce 执行顺序(Order of Execution)详解
Salesforce 执行顺序(Order of Execution)是每个开发人员必须掌握的核心概念,它定义了 Salesforce 在记录被插入、更新、删除或恢复时处理事件的具体步骤。理解这一流程对于避免触发器、验证规则和自动化流程之间的冲突至关重要,能确保业务逻辑按预期执行。
什么是执行顺序?
执行顺序指的是当记录被保存(插入或更新)时,Salesforce 遵循的一系列处理步骤。这个过程确保所有业务规则、验证和自动化逻辑以一致的顺序应用,避免数据不一致或逻辑冲突。
完整执行顺序
以下是记录被保存时发生的详细事件序列:
1. 初始化(Initialize)
- 系统加载数据库中的原始记录(针对更新操作)或初始化新记录(针对插入操作)。
- 验证用户是否有执行当前操作的权限(如对象级权限、字段级权限)。
- 合并触发器上下文变量(
Trigger.old
、Trigger.new
等),供后续步骤使用。
2. 预验证触发器(Before Triggers)
- 执行 before 触发器(声明为
before insert
或before update
的触发器)。 - 这是修改记录字段的最早时机,此时数据尚未经过系统验证。
- 常见用途:设置默认值、标准化数据格式(如统一邮箱格式)。
trigger AccountBeforeTrigger on Account (before insert, before update) {for (Account acc : Trigger.new) {// 为新记录设置默认行业if (Trigger.isInsert && acc.Industry == null) {acc.Industry = 'Technology';}// 标准化网站格式(添加 http://)if (acc.Website != null && !acc.Website.startsWith('http')) {acc.Website = 'https://' + acc.Website;}}
}
3. 系统验证(System Validations)
- 执行基础数据验证:
- 检查必填字段是否已填写
- 验证字段格式(如邮箱、电话格式)
- 确保数据类型匹配(如数字字段不包含文本)
- 检查记录所有权规则和角色层级权限
- 执行 验证规则(Validation Rules)。
- 若任何验证失败,整个保存过程终止并返回错误信息。
4. 记录级操作(Record-Level Actions)
- 生成 自动编号(Auto-number) 字段值(仅插入操作)。
- 更新系统字段(如
CreatedDate
、LastModifiedDate
)。 - 执行 字段默认值(Field Defaults)(未被触发器覆盖的字段)。
- 处理 主从关系字段(如查找字段引用的记录是否存在)。
5. 数据库操作(Database Operations)
- 将记录写入数据库(此时记录已保存,但尚未触发后续自动化)。
- 对于更新操作,系统会创建记录的历史版本(供后续审计追踪)。
6. 后操作触发器(After Triggers)
- 执行 after 触发器(声明为
after insert
或after update
的触发器)。 - 此时记录已保存到数据库,可获取系统生成的字段(如
Id
、自动编号)。 - 常见用途:同步数据到外部系统、创建关联记录(如商机创建后自动生成任务)。
trigger OpportunityAfterTrigger on Opportunity (after insert) {List<Task> tasks = new List<Task>();for (Opportunity opp : Trigger.new) {// 为新商机创建跟进任务tasks.add(new Task(Subject = '跟进商机:' + opp.Name,WhatId = opp.Id,ActivityDate = Date.today().addDays(3),Priority = 'High'));}insert tasks; // 批量插入任务
}
7. 流程和自动化(Processes and Automation)
- 执行 Workflow 规则(包括字段更新、邮件提醒等)。
- 执行 Process Builder 流程。
- 执行 Flow 自动流程(如记录触发的 Flow)。
- 注意:这些自动化可能再次修改记录,导致触发新一轮的验证和触发器(称为“递归”)。
8. 权限重新验证(Re-validation)
- 若自动化流程修改了记录,系统会重新执行:
- 验证规则(Validation Rules)
- 字段级安全检查
- 必要时再次执行 before 触发器(仅当记录被修改时)
9. 最终更新(Final Updates)
- 系统更新所有因自动化流程产生的字段变更。
- 更新相关的汇总字段(如父对象的汇总字段)。
- 处理 roll-up summary 字段 的计算。
10. 后续操作(Post-Commit Actions)
- 执行 异步操作:
- 触发
@future
方法 - 执行 Queueable 任务
- 发布 Platform Event
- 触发
- 发送 电子邮件通知(Workflow 或 Process Builder 触发的邮件)。
- 这些操作在记录成功保存后执行,即使后续步骤失败,记录也不会回滚。
11. 触发后续事件(Subsequent Events)
- 若当前操作导致其他记录被修改(如级联更新),系统会对这些记录触发新的执行顺序。
- 例如:更新父账户后,触发子联系人的更新流程。
关键注意事项
-
递归问题:自动化流程修改记录可能导致触发器和验证规则重新执行,需通过代码控制(如使用静态变量)避免无限循环。
-
事务边界:整个执行顺序在一个事务中完成,任何步骤失败都会导致全部操作回滚(异步操作除外,它们在事务提交后执行)。
-
字段可见性:触发器可以修改用户无权限的字段,但流程和 Workflow 受字段级安全限制。
-
删除操作的特殊性:删除记录时,执行顺序会简化(无字段验证),主要执行 before delete 和 after delete 触发器、删除相关记录等。
实际应用示例
假设创建一个新的 Opportunity 记录,执行顺序如下:
- 初始化新 Opportunity 记录,验证用户权限。
- Before insert 触发器设置默认 CloseDate。
- 系统验证必填字段(如 Name、StageName)和验证规则。
- 生成 Opportunity 的 Id 和系统字段。
- 将记录写入数据库。
- After insert 触发器创建关联的 Task。
- Process Builder 检查金额,若超过 10 万则自动分配给销售经理。
- 重新验证修改后的记录(如负责人变更)。
- 更新账户的汇总金额(若有 roll-up 字段)。
- 触发 @future 方法同步数据到外部 ERP。
- 发送新商机通知邮件。
理解 Salesforce 执行顺序是设计可靠自动化和触发器的基础。通过掌握这一流程,开发人员可以准确预测代码和配置的执行结果,避免常见的集成冲突和数据不一致问题。