首先,您需要将逻辑放在 Territory 对象的 AFTER UPDATE 触发器中,而不是 BEFORE UPDATE 部分。作为一般规则,如果您需要更新触发器操作所针对的记录/对象上的字段或值(即在您的情况下为 Territory 对象),那么您使用 BEFORE UPDATE 或 BEFORE INSERT 部分,如果您想创建/更新/删除其他记录/对象(即您的情况下的联系人),您使用更新后或插入后部分。
其次,我认为从触发器启动批处理顶点过程没有任何问题。
例如,假设您有一个名为“BatchUpdateContactsBasedOnTerritory”的批处理类。该课程具有三 (3) 个关键功能:
- 除了“Database.Batchable”之外,它还实现了“Database.Stateful”
- 它有一个构造方法,该方法将地区列表作为参数/参数
- 它有一个成员变量来保存传入的地区列表
您的批处理课程的一部分:
global list<Territory> TerritoryList;
global BatchUpdateContactsBasedOnTerritory(list<Territory> updatedTerritories){
TerritoryList = updatedTerritories;
}
你的触发器:
trigger TerritoryTrigger on Territory (after delete, after insert, after undelete, after update, before delete, before insert, before update)
{
if(trigger.isInsert)
{
if(Trigger.isBefore){
// before insert event not implemented
}
else if(Trigger.isAfter){
// after insert event not implemented
}
}else if(trigger.isUpdate){
if(Trigger.isBefore){
// before update event not implemented
}
else if(Trigger.isAfter){
// after update event - call batch class to process 1000 records at a time
Database.ExecuteBatch(new BatchUpdateContactsBasedOnTerritory(trigger.new),1000);
}
}else if(trigger.isDelete){
if(Trigger.isBefore){
// before delete event not implemented
}
else if(Trigger.isAfter){
// after delete event not implemented
}
}
else if(Trigger.isUnDelete){
// undelete event not implemented
}
}