<DAY207>一括トリガー
●9/16(月)
●学習日数 207日
●学習時間(本日)3時間
●累計学習時間 871.0時間
●一日あたりの平均学習時間 4.21時間
一括トリガーの設計にする理由
トリガのパフォーマンスが向上し、サーバリソースの消費が抑えられ、プラットフォームの制限を超える可能性が低くなる。
一括処理化されたコードによって多数のレコードを効率的に処理でき、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; } }