プログラマ38の日記

主にプログラムメモです。

Salesforce : Apexトリガメモ

自分用にあらためて整理した。

 

トリガテンプレート

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トリガは実行されない。

カスケードデリートで削除されたレコードを参照する子レコードのトリガは実行されない。

 

網羅できているわけではないけど、たまに忘れるのでメモ。