問題
開発者は、リードオブジェクトにbefore insertトリガーを使用して、Territory__c.PostalCode__cがLead.PostalCodeと一致するTerritory__cオブジェクトを取得します。しかし、開発者がデータローダーを使用して10,000のリードレコードを挿入すると、コードが失敗します。
for (Lead l : Trigger.new) {
if (l.PostalCode != null) {
List<Territory__c> terrList = [SELECT Id FROM Territory__c WHERE PostalCode__c = :l.PostalCode];
if(terrList.size() > 0) {
l.Territory__c = terrList[0].Id;
}
}
}
どのコード行がコードブロックの失敗の原因となっていますか。
- 3行目:SOQLクエリがforループコードの内部に配置されてるため
- 1行目:before insertトリガーではTrigger:newは無効なため
- 2行目:PostalCodeがnullの場合、NullPointer例外がスローされるため
- 5行目:before insertトリガー内のLeadは更新できないため
正解
- 3行目:SOQLクエリがforループコードの内部に配置されてるため
- 1行目:before insertトリガーではTrigger:newは無効なため
- 2行目:PostalCodeがnullの場合、NullPointer例外がスローされるため
- 5行目:before insertトリガー内のLeadは更新できないため
解説
それぞれの選択肢の理由について説明します。
□ 3行目:SOQLクエリがforループコードの内部に配置されてるため
これは正解です。大量のレコードを処理する際、ループの中でSOQLクエリを実行すると、すぐにSOQLクエリの制限に達してしまいます。このような設計は、大量のデータを処理する際に効率的ではありません。
□ 1行目:before insertトリガーではTrigger:newは無効なため
これは不正解です。Trigger.newはbefore insertトリガーで有効です。これは新しく挿入されるレコードのリストを参照します。
□ 2行目:PostalCodeがnullの場合、NullPointer例外がスローされるため
これは不正解です。コードはl.PostalCodeがnullでない場合のみSOQLクエリを実行するようになっているため、NullPointer例外は発生しません。
□ 5行目:before insertトリガー内のLeadは更新できないため
これは不正解です。before insertトリガー内では、Trigger.newのレコードの項目を変更することができます。そのため、この行は問題を引き起こすものではありません。
コメント