【Salesforce 認定Platformデベロッパー】試験対策:第152問

問題

開発者は、取引先オブジェクトの’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クエリの発行は避けることが推奨されます。

次の問題へ

前の問題へ

1問目から復習する

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

雇われのシステムエンジニアです。
普段は車載ECUのセキュリティー分野に従事しております。

コメント

コメントする

目次