Salesforce 認定 Platform デベロッパー 上級 無料問題 1 / 10 ・ 分野1: 上級デベロッパーの基本
Job__c の組織の共有設定は「公開/参照のみ」になっている。採用担当者に参照のアクセスを与えるため、次のコードで共有のレコードを作った。 Job__Share s = new Job__Share(ParentId = jobId, UserOrGroupId = userId, AccessLevel = 'Read'); Database.SaveResult r = Database.insert(s, false); この結果について正しいものはどれか。
- 保存は成功し、参照のアクセスが共有の行として残る
- AccessLevel に All を入れれば、組織の共有設定に関係なく保存できる
- 組織の共有設定より高いアクセスでないため、保存は失敗する
- allOrNone を false にしたので、アクセスが Edit に上がる
正解と解説を見る
正解: C
正解の理由
共有オブジェクトの AccessLevel(Edit・Read)は、親オブジェクトの組織の共有設定より高いアクセスにする必要がある。公開/参照のみの Job__c に Read の共有を作ると、意味の無い(それ以下の)アクセスとして保存が失敗する。ドキュメントの例は、この失敗をステータスコード FIELD_FILTER_VALIDATION_EXCEPTION と AccessLevel を含むメッセージで見分け、成功扱いにしている。All は内部の値で与えられない。
違う選択肢
「保存は成功し、参照のアクセスが共有の行として残る」… AccessLevel は親オブジェクトの組織の共有設定より高いアクセスにする必要がある。公開/参照のみの組織に Read を入れても、保存は失敗する。
「AccessLevel に All を入れれば、組織の共有設定に関係なく保存できる」… All は内部の値で、共有のレコードに与えることはできない。参照のみより高いアクセスを与えるなら Edit にする。
「allOrNone を false にしたので、アクセスが Edit に上がる」… allOrNone を false にすると、失敗したレコードがあっても処理全体は止まらず、結果は SaveResult で受け取る。アクセスレベルが自動で上がることは無い。
書き方の要点
組織の共有設定が変わる可能性のあるオブジェクトでは、Read の共有が要らなくなることもある。Database.insert(レコード, false) で部分的な成功を許し、SaveResult の getErrors() でこのエラーだけを許容する書き方にしておくと、まとめて共有するときに1件の失敗で全体が戻らない。