yujiroのプログラミング

勉強内容をアウトプットし、サボらないようにする為のブログ

<DAY207>一括トリガー

\ Follow me!! /

●9/16(月)
●学習日数 207日
●学習時間(本日)3時間
●累計学習時間 871.0時間
●一日あたりの平均学習時間 4.21時間

f:id:yujiro0320:20190904163314p:plain

一括トリガーの設計にする理由

トリガのパフォーマンスが向上し、サーバリソースの消費が抑えられ、プラットフォームの制限を超える可能性が低くなる。
一括処理化されたコードによって多数のレコードを効率的に処理でき、Lightning Platform のガバナ制限内でコードを実行できる。こうしたガバナ制限を設定する目的は、回避コードがマルチテナントプラットフォームのリソースを占有しないようにすることです。

1 つのレコードのみによってトリガが実行されたことを想定(悪い例)

trigger MyTriggerNotBulk on Account(before insert){
  Account a = Trigger.New[0];
  a.Description = "hogehoge";
}

1 つの sObject または複数の sObject がある場合に機能(良い例)

trigger MytriggerBulk on Account(before insert){
  for(Account a : trigger.New){
  a.Description = "hogehoge";
  }
}

SOQLを使用する場合のアプローチ(悪い例)

trigger SoqlTriggerNotBulk on Account (after update) {
    
    for(Account a : Trigger.New){
        //各アカウントの子レコードを取得する
        //アカウントごとに発酵させる非効率的なクエリ        
        Opportunity[]opps =[SELECT Id,Name,CloseDate FROM Opportunity WHERE AccountId = :a.Id ];
      
    }

}

SOQLを使用する場合のアプローチ(良い例)

先に取得してから繰り返す。

trigger SoqlTriggerBulk on Account (before insert) {
    //商談に関係する取引先データーを取得する
    List<Account>acctsWithOpps =[SELECT Id,(SELECT Id,Name,CloseDate FROM Opportunities)FROM Account WHERE Id IN :Trigger.New];
    //返されたアカウントを反復処理する
    for(Account a : acctsWithOpps){
        Opportunity[]relatedOpps  = a.Opportunities;
    }
}