触发器
触发器可以在以下类型操作的之前或之后运行
- 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 |
Trigger.newMap | 新版本数据的 Ids,只能在 after insert、after undelete、before update、after update 中使用 |
Trigger.old | 旧版本数据(list |
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;
}
合并操作
- 前置删除触发器触发
- 后置触发器触发,Trigger.old 上 设置 MasterRecordId
- 更新触发器触发