問題
開発者は、取引先オブジェクトの’after update’トリガーを使用して、取引先に関連するすべての取引先責任者を更新します。以下に示すトリガーコードは、ランダムに失敗します。
List<Contact> theContacts = new List<Contact>();
for (Account a : Trigger.new) {
for (Contact c : [SELECT Id, Account_Date__c FROM Contact WHERE AccountId = :a.Id]) {
c.Account_Date__c = Date.today();
theContacts.add(c);
}
}
update theContacts;
このコードブロックが失敗する原因は次のうちどれですか。
- theContactsが空の場合は例外がスローされます。
- Account_Date__cがnullの場合、例外がスローされます。
- トリガーは、forループで200 以上のレコードを処理します。
- SOQLクエリがforループ内にあります。
正解
- theContactsが空の場合は例外がスローされます。
- Account_Date__cがnullの場合、例外がスローされます。
- トリガーは、forループで200 以上のレコードを処理します。
- SOQLクエリがforループ内にあります。
解説
それぞれの選択肢の理由について説明します。
□ theContactsが空の場合は例外がスローされます。
これは不正解です。theContactsリストが空の場合でも、updateステートメントを使用してそのリストを更新しようとしても、例外はスローされません。更新するレコードがない場合、単に何も実行されないだけです。
□ Account_Date__cがnullの場合、例外がスローされます。
これは不正解です。Account_Date__c
がnullであっても、Date.today()
メソッドで現在の日付を代入しているため、null値による例外は発生しません。この代入は問題なく機能します。
□ トリガーは、forループで200 以上のレコードを処理します。
これは不正解です。問題の主な原因は「forループ内でのSOQLクエリの発行」にあります。もしTrigger.new
が200のレコードを持っている場合、このコードは200回のSOQLクエリを発行することになり、これがガバナ制限の「発行される SOQL クエリの合計数」の制限を超える可能性があります。ただし、単純にforループで200以上のレコードを処理すること自体は問題ではありません。
□ SOQLクエリがforループ内にあります。
これは正解です。forループ内でSOQLクエリを実行すると、多数の取引先レコードが更新される場合にSOQLクエリのガバナ制限に達するリスクが高まります。このような設計は、ガバナ制限を超える可能性があるため、ランダムに失敗する原因となります。通常の開発プラクティスでは、ループ内でのSOQLクエリの発行は避けることが推奨されます。
コメント