您可以在触发器中解释执行顺序吗?
以下是Salesforce在DML事件之前执行的事件的执行顺序。
记录是从数据库加载的,或者在使用upset语句的情况下被初始化。
新记录的字段值将覆盖旧值,**现在取决于请求的来源,此流程有所不同**:
如果请求来自UI页面,则Salesforce将执行以下验证:
检查所有布局特定的规则
在布局和字段级别检查所有必需的值
验证所有字段格式以及最大字段值长度
如果请求不是由UI发起的,则Salesforce仅检查外键的有效性。
现在,所有之前的触发器都在数据库中执行。
再次执行大多数验证,以验证所有必填字段都包含一些值并且不为null,在此步骤中,还将执行用户定义的验证,并且在此步骤中唯一不重复的验证是特定于布局的规则。
在上一步成功之后,通过运行重复规则,对记录进行复查。如果发现重复,则流程停止,并且不执行进一步的操作。
在此步骤中,记录已保存到数据库,但尚未提交。
现在,所有之后的触发器都将执行。
在此步骤中,执行分配规则。
现在,如果存在任何自动响应规则,则将执行它们。
队列中的下一个是工作流,它们在自动响应后执行。
如果工作流正在更新字段,则在这种情况下,字段将在此步骤中更新,并且在此步骤之后的流程会有所不同。
如果字段已更新,则会再次触发更新前和更新后触发器,并且标准验证也将再次执行。自定义验证升级规则和重复规则不需要再次运行。
一旦执行到达此阶段,则如果在对象上声明了任何内容,则将触发过程。
现在执行升级规则。
如有权利规则,将执行。
如果有任何汇总字段,则在此步骤中将对它们进行计算,并且父对象将进行保存过程。
现在执行共享规则。
如果我们达到了这个阶段,则意味着没有错误发生,并且数据已准备好提交到数据库并立即提交。
现在,如果有任何提交后的逻辑(例如电子邮件),则将执行该逻辑。
1 什么是触发器?
Apex触发器使您可以在事件发生之前或之后对Salesforce中的记录(例如插入,更新或删除)执行自定义操作。就像数据库系统支持触发器一样,Apex为管理记录提供触发器支持。
使用触发器来执行通过使用Salesforce用户界面中的点击工具无法完成的任务。例如,如果验证字段值或更新记录中的字段,请改用验证规则和工作流程规则。
2 什么是触发器语法?
trigger TriggerName on ObjectName (trigger_events) {
code_block
}
3 触发器可以触发哪些事件?
触发器是可以在以下事件上执行的一组语句。在以上触发事件中,可以使用以下事件中的一个或多个,并以逗号分隔。
插入之前
更新之前
删除之前
插入后
更新后
删除后
取消删除后
有哪些不同类型的触发器?
有两种类型的触发器:
isExecuting:如果Apex代码的当前上下文是触发器,而不是Visualforce页面,Web服务或工具,则返回true。 executeanonymous() API调用。
isInsert:返回 真的 如果由于插入操作而从Salesforce用户界面,Apex或API中触发了此触发器。
isUpdate:返回 真的 如果由于更新操作而从Salesforce用户界面,Apex或API中触发了此触发器。
isDelete:返回 真的 如果由于删除操作而从Salesforce用户界面,Apex或API中触发了此触发器。
isBefore:返回 真的 如果在保存任何记录之前触发了此触发器。
isAfter:返回 真的 保存所有记录后是否触发了此触发器。
isUndelete:返回 真的 如果从回收站中恢复记录后(即从Salesforce用户界面,Apex或API取消删除操作之后)触发了此触发器。
new:返回sObject记录的新版本的列表。该sObject列表仅在插入,更新和取消删除触发器中可用,并且记录只能在触发器之前进行修改。
newMap:ID到sObject记录的新版本的映射。该映射仅在更新之前,插入之后,更新之后和取消删除触发器之后才可用。
old:返回sObject记录的旧版本的列表。此sObject列表仅在 更新 和 删除 触发器。
oldMap:ID到sObject记录的旧版本的映射。此地图仅在 更新 和 删除 触发器。
size:触发器调用中新旧记录的总数。
4 Trigger.New与Trigger.newMap有何不同?
Trigger.New变量返回已调用触发器的sObject的列表,而Trigger.NewMap返回具有新输入记录的ID的映射。NewMap仅在插入后,更新前后和取消删除后才可用。
5 Trigger.new与Trigger.old有何不同?
Trigger.New变量返回已调用触发器的sObject的列表,而Trigger.old返回已调用触发器的记录的较旧版本的列表。Trigger.Old仅在更新和删除事件中可用
6 定义递归触发器,以及如何避免它?
触发器的结果有可能最终再次调用同一触发器,并且可以循环运行,这称为递归触发器。为了避免这种情况,我们应该创建一个静态变量并在执行触发器中的任何操作之前检查此变量的值。
7 在对象上定义的触发器数量是否有限制?
我们可以根据需要在一个对象上定义任意数量的触发器,但是建议每个对象有一个触发器,因为不能保证不同触发器的执行顺序,并且任何触发器都可以首先触发。