触发器

触发器可以在以下类型操作的之前或之后运行

  • insert
  • update
  • delete
  • merge
  • upsert
  • undelete

触发器不能包含 static 关键词

触发器中不用写数据库提交语句,触发器执行成功会自动提交,失败会自动回滚


trigger TriggerName on ObjectName (
        before insert,
        before update,
        before delete,
        after insert,
        after update,
        after delete,
        after undelete,
    ) {
        // DO STH
    }

触发器上下文

操作 描述
Trigger.isExecuting 当前上下文是否是触发器
Trigger.isInsert 是否是插入操作触发
Trigger.isUpdate 是否是更新操作触发
Trigger.isDelete 是否是删除操作触发
Trigger.isBefore 是否是前置操作触发
Trigger.isAfter 是否是后置操作触发
Trigger.isUndelete 是否是还原删除触发
Trigger.new 新版本数据(list),可以在 insert update undelete 中使用,只能在前置触发器中修改
Trigger.newMap 新版本数据的 Ids,只能在 after insert、after undelete、before update、after update 中使用
Trigger.old 旧版本数据(list),只能在 update、delete 中使用
Trigger.oldMap 新版本数据的 Ids,只能在 update、delete 中使用
Trigger.operationType 当前操作的枚举值,包含:BEFORE_INSERT、BEFORE_UPDATE、BEFORE_DELETE,AFTER_INSERT、AFTER_UPDATE、AFTER_DELETE、AFTER_UNDELETE
Trigger.size 触发器调用中的新旧记录总数

Trigger.new 可以遍历,也可以在查询语句中直接使用


Trigger simpleTrigger on Account (after insert) {
    for (Account a : Trigger.new) {
    }

    Contact[] cons = [SELECT LastName FROM Contact
                      WHERE AccountId IN :Trigger.new];
}

Trigger.old 是永远只读的,Trigger.new 只有在部分情况下可以修改

事件 是否可以修改 Trigger.new 对象 是否可以使用 DML 语句更新原始数据 是否可以使用 DML 语句删除原始数据
before insert 否(数据还没写入) 否(数据还没写入)
after insert 是(没有必要新增完立即删除)
before update
after update 是(注意无限递归问题) 是(没有必要修改完立即删除)
before delete 是(如果取消删除,更新就会生效)
after delete 否(对象已被删除)
after undelete 是(没有必要刚还原又删除)

批量处理,防止达到salesforce限制

借助 Set Map 来减少 SQL 操作


trigger oppLineTrigger on OpportunityLineItem (before insert) {

    // Id 去重保存
    Set<Id> pbeIds = new Set<Id>();
    for (OpportunityLineItem oli : Trigger.new) 
        pbeIds.add(oli.pricebookentryid);

    // 一次查询即可
    Map<Id, PricebookEntry> entries = new Map<Id, PricebookEntry>(
        [select product2.color__c from pricebookentry 
         where id in :pbeIds]);

    // 使用 Id 关联设置颜色
    for (OpportunityLineItem oli : Trigger.new) 
        oli.color__c = entries.get(oli.pricebookEntryId).product2.color__c;  
}

合并操作

  1. 前置删除触发器触发
  2. 后置触发器触发,Trigger.old 上 设置 MasterRecordId
  3. 更新触发器触发

results matching ""

    No results matching ""