Trigger介绍

Apex Trigger允许你在记录DML前以及后进行一些自定义的操作。比如做一些校验,发送邮件等等。trigger可以在以下的操作中进行before/after的逻辑操作:insert / update / delete / merge / upsert / undelete。通常我们针对一个表只使用一个trigger,去完成所有的相关的逻辑。Trigger中有before / after概念,两者使用场景如下:

一言以蔽之,trigger用于在数据执行DML的前后做一些系统通用的数据的自定义逻辑操作。

Trigger定义,上下文变量以及操作

trigger的定义如下代码所示,其中 trigger_events包括以下:

trigger TriggerName on ObjectName (trigger_events) {
	code_block
}

我们可以在trigger中针对这些trigger的事件进行自定义逻辑的编码。Trigger核心的内容是Trigger的上下文可以使用的变量。信息如下所示:

变量名称 使用场景 考虑点
isExecuting 如果当前apex code执行的上下文是trigger的场景,则 isExecuting为true,如果为其他场景,则为false(比如lwc调用apex)
isInsert 当前的数据操作是正在执行insert操作
isUpdate 当前的数据操作是正在执行update操作
isDelete 当前的数据操作是正在执行delete操作
isBefore 当数据保存以前的阶段,则为true
isAfter 当数据在保存以后的阶段,则为true
isUndelete 当前数据操作是回收站回滚这条数据操作
new 返回当前的最新版本数据的列表 Trigger.new仅能用于 before insert/update/undelete
newMap 返回当前的最新版本数据的Map,其中key是当前记录的ID,value是当前最新版本数据的引用 仅能用于before update / after insert / after update / after undelete
old 返回当前的前一个版本数据的列表 仅用于 update和delete场景
oldMap 返回前一个版本数据的Map,其中key是当前记录的ID,value是前一个版本数据的引用 仅用于 update和delete场景
operationType 返回枚举值,用来记录当前的trigger执行状态的类型。可选值有BEFORE_INSERT, BEFORE_UPDATE, BEFORE_DELETE,AFTER_INSERT, AFTER_UPDATE, AFTER_DELETE, and AFTER_UNDELETE.
size trigger调用的总记录数

Trigger实施时的考虑

  1. trigger写代码永远考虑批量数据处理,即使目前的业务只有单条操作的场景。尽量避免使用 Trigger.new(0)这种获取第一条的操作。
  2. Trigger.new / Trigger.old仅能用于trigger上下文中,其他的DML操作是不允许使用的。
  3. trigger.old永远是只读状态,想要更新当前数据的value,只能在before场景的trigger.new来处理。
  4. trigger.new在after场景永远是只读状态。