まず、BEFORE UPDATEセクションではなく、TerritoryオブジェクトのAFTERUPDATEトリガーにロジックを配置する必要があります。原則として、トリガーアクションの対象となるレコード/オブジェクト(つまり、この場合はテリトリーオブジェクト)のフィールドまたは値を更新する必要がある場合は、BEFOREUPDATEまたはBEFOREINSERTセクションを使用します。他のレコード/オブジェクト(つまり、この場合は連絡先)を作成/更新/削除する場合は、[更新後]または[挿入後]セクションを使用します。
第二に、トリガーからバッチアペックスプロセスを開始することに何も問題はないと思います。
たとえば、「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
}
}