自分用にあらためて整理した。
トリガテンプレート
trigger AccountTrigger on Account (before insert, before update, before delete, after insert, after update , after delete , after undelete) { switch on Trigger.operationType { when BEFORE_INSERT { AccountTriggerHandler.onBeforeInsert(Trigger.New); } when BEFORE_UPDATE{ AccountTriggerHandler.onBeforeUpdate(Trigger.New, Trigger.Old); } when BEFORE_DELETE{ AccountTriggerHandler.onBeforeDelete(Trigger.Old); } when AFTER_INSERT{ AccountTriggerHandler.onAfterInsert(Trigger.New); } when AFTER_UPDATE{ AccountTriggerHandler.onAfterUpdate(Trigger.New,Trigger.Old); } when AFTER_DELETE{ AccountTriggerHandler.onAfterDelete(Trigger.Old); } when AFTER_UNDELETE { AccountTriggerHandler.onAfterUnDelete(Trigger.New); } } }
operationType を使うと Trigger.isNew Trigger.isBefore といったコンテキストの値を2つ使わなくてよくなる。
Before時:トリガーレコードの項目値の変更が可能、レコード毎にaddErrorでエラー制御が可能。
After時で、トリガーレコードの項目値は変更不可、レコード毎にaddErrorでエラー制御は不可(1レコードでもaddErrorするとそのトリガー内のレコードがエラー扱い。
処理上のポイント(自分的なもの)
Trigger.sizeは最大200、処理的な制約があり最大件数を制限する場合はbeforeトリガでサイズオーバーの場合はaddErrorする。
before insert と after insert で処理のポイントはafter insertでIdがセットされる
before update と after update で処理のポイントは、Trigger.NewとTrigger.Oldを比較することで処理を行う(値が変更された場合のみ処理を行う制御が可能)
before delete と after delete で処理のポイントは、after deleteでは、削除レコードを参照する子レコードの削除時の処理が実行されること(参照項目をクリアする場合は、子レコードの参照項目はクリアされる)、before deleteでもafter delete でもまだそのオブジェクトをselectするとレコードは取得できる。削除したレコードを除外する場合は明示的にwhere句で除外する。
カスケードデリートで削除された場合は、deleteトリガは実行されない。
カスケードデリートで削除されたレコードを参照する子レコードのトリガは実行されない。
網羅できているわけではないけど、たまに忘れるのでメモ。