親子関係の1つである主従は親子間の結びつきが強いですが、必ずアクセス権が連動する訳ではありません。
主従関係の従レコードに対する共有設定
Salesforceでは親子関係を定義する際に主従関係、参照関係の2つがあります。今回は主従関係についてみていきます。
●従レコードの共有設定
従レコードは共有設定で個別に設定が出来ません。
共有設定では一律「親レコードに連動」になっていますが、編集画面では表示されないため「親レコードに連動」から変更できないことが分かります。
●従レコードの共有ルール
共有設定と同様、従オブジェクトには共有ルールの作成箇所がないため作成できません。
主オブジェクトに設定した共有ルールが一律で従レコードへ引き継がれます。
主従レコードのアクセス権は常に連動するわけではない
主レコードにアクセス権が付与された場合、必ずその従レコードにも連動して同じアクセス権が付与されるとは限りません。
従オブジェクトが主オブジェクトから引き継ぐのはロールや共有設定、共有ルールであり、
その後のプロファイル、権限セットでは主と従では別々のアクセス権付与になる点は混同しないように注意が必要です。
●主従のアクセス権が連動しない例を見てみましょう。
例1、例2とも、主である売上オブジェクトは共有設定「公開/参照・更新可能」前提
例1:下記の状態では売上が参照編集可能状態であっても、売上明細は参照のみ可能です。
売上の編集権限が売上明細へ引き継がれる訳ではない点に注意です。
※売上と売上明細は主従関係前提
例2:逆に下記では売上が参照のみですが、売上明細は参照編集削除が可能となります。
※売上と売上明細は主従関係前提
従オブジェクトの一部レコードへのみアクセス権を付与したい場合
主レコードへアクセス権付与しつつ、従オブジェクトの一部レコードへのみアクセス権を付与したい場合です。
結論:制限ルールを使用することで可能です。
通常、下記のようなことはもちろん可能です。
・プロファイルAユーザへ売上明細のアクセス権を一律付与する
・プロファイルBユーザへ売上明細のアクセス権を一律付与しない
ただし、同一ユーザ1名に対して下記を同時に実現することは通常できません。
・売上レコードXへアクセス権付与する + 売上明細Yレコードへアクセス権付与する
・売上レコードXへアクセス権付与する + 売上明細Zレコードへアクセス権付与しない
このシーンでは制限ルールを使うことで要望を満たすことができます。
・プロファイルか権限セットで売上明細オブジェクトへアクセス権を一律付与しておく
・ただし制限ルールに合致しないレコードのみは、アクセス権をはく奪する
ということが可能です。
制限ルールの使い方は別記事で検証しています。
主レコードへアクセス権付与無し、従のみアクセス権付与したい場合
結論:従オブジェクトへのみプロファイルか権限セットで「すべて表示」や「すべて変更」を付与することで可能です。
この場合は従オブジェクトへのみ権限付与すれば良いので、たとえば下記の形です。
売上には最低でも「参照」権限がないと、売上明細に参照以上の権限は仕様上付与できないので上記設定になっています。
売上は事前に別途共有設定で「非公開」としておくことで一律アクセス不可と出来ます。
結果的に下記が実現できました。
・売上(主オブジェクト)
共有設定で「非公開」になっているため、プロファイルか権限セットで参照権限を付与していてもアクセス不可となる
・売上明細(従オブジェクト)
ベースは売上のアクセス権を引き継いでアクセス不可となるが、「すべて変更」付与しているため参照作成編集削除のすべてが可能になる
主レコードが2つある場合の従レコードアクセス権
いわゆる中間オブジェクト、ジャンクションオブジェクト、連結オブジェクト、N対Nリレーション、多対多リレーション等と呼ばれる形です。
結論:
・アクセス権はより厳しいアクセス権設定の主に準ずる
・所有者はプライマリオブジェクトから引き継ぐ
例えば主オブジェクトが「売上」「売上2」の2つのオブジェクト、従オブジェクトが「売上明細」の場合を考えます。
●アクセス権
下記の場合、「非公開」の方が厳しいアクセス権のため従オブジェクトも「非公開」となる。
・売上オブジェクトの共有設定:公開/参照のみ
・売上2オブジェクトの共有設定:非公開
→この従オブジェクトの共有設定をベースに、プロファイルか権限セットで設定する従オブジェクトへのアクセス権付与を経て最終的なアクセス権が決定します。
●所有者
プライマリの主オブジェクトの所有者が従オブジェクトへ引き継がれます。
従オブジェクトである「売上明細」へ2つの主従関係項目がありますが、どちらのカスタム項目を先に作成したかが重要です。
・売上オブジェクトへの主従関係項目作成、その後に売上2オブジェクトへの主従関係項目作成
という順番だった場合は売上明細オブジェクトに対して下記となります。
・プライマリオブジェクトが「売上」
・セカンダリオブジェクトが「売上2」
この場合は売上レコードの所有者が売上明細レコードへ引き継がれます。
各明細レコード自体自体の新規作成時に「売上」項目、「売上2」項目のどちらの項目へ先に値を入力したかという訳ではなく、
あくまでオブジェクトマネージャー上で売上明細オブジェクトへ最初に作成した主従関係項目がプライマリオブジェクトとして機能する点に注意です。
参考ドキュメント
多対多リレーション
連結オブジェクトのレコードへの共有アクセス権は、ユーザーの両方のマスターレコードへのアクセス権と、[共有設定] オプションによって決まります。
レコード所有権: 連結オブジェクトのレコードは、プライマリ主オブジェクトのレコードの [所有者] 項目の値を継承します。
https://help.salesforce.com/s/articleView?id=sf.relationships_considerations.htm&type=5
余談:レコード削除後の復活時挙動
1.従レコードを削除する場合
・従レコードはごみ箱に移動する
・主レコードはそのまま削除されず残る
2.主レコードを削除、および復活させた場合
・主レコード、および関連する従レコードはごみ箱に移動する
・従レコードを復活させると:従レコードのみが復活
・主レコードを復活させると:主レコード、および従レコードも連動して復活する
ただし従レコードのみを最初に削除し主レコードを後から削除すると、主レコード復活時に従レコードは連動して復活はしない
オプション:カスタム項目の主従関係項目作成時の設定
結論:基本的にはデフォルト値である「参照・更新」のままにしておく方が無難
主従項目作成時の下記「共有設定:関連する従レコードを作成、編集、削除するために主レコードに必要な最低限のアクセス権を選択します。」は注意が必要です。
これは通常の共有設定画面でないですが、この画面が従レコードの「共有設定」にあたります。
1.「参照・更新」とする場合
このパターンは主オブジェクトが参照のみ権限の場合、従オブジェクトも参照のみとなるため自然な流れで違和感ありません。
①従オブジェクトで主従関係項目作成時↓
➁主オブジェクトの共有設定↓
①の設定で従レコードの作成/編集/削除が可能なのは、主レコードが「参照・更新」以上を持つ場合と限定しています。
しかし➁の共有設定で主オブジェクトの共有設定を「公開/参照のみ」としたため、主オブジェクトの権限が足りません。
結果的に、プロファイルか権限セットで従オブジェクトへ作成/編集/削除権を付与しても、従レコードの作成/編集/削除はエラーとなり失敗します。
例:上記前提で、プロファイルで下記権限付与
(主オブジェクトの共有設定は参照のみなので、プロファイルで参照以上の権限を付与しても参照のみとしかならない前提)
結果:従レコードである売上明細の新規作成画面は表示できるが、「保存」ボタンを押すと作成エラーとなる。主オブジェクトが参照のみであるため、従レコードも保存できないのは自然。
→エラー:insufficient access rights on cross-reference id
このエラーから分かるように、プロファイルで作成/編集/削除権限を付与すればでそれぞれ新規ボタン/編集ボタン/削除ボタンが該当レコードへは表示されます。
ただしボタンが表示されたからといって処理が正常実施できるとは限りません。
前提となる共有設定や共有ルールで権限付与されていないと、新規作成の保存ボタンや削除ボタンを押したタイミングでエラーになります。
2.「参照のみ」とする場合
一方このパターンは主オブジェクトが参照のみであっても、従オブジェクトは作成編集削除出来てしまうの為違和感がある設定になります。意図してこの設定をする際はステークホルダー全員が意識的に把握しておくべき部分です。
従オブジェクトで主従関係項目作成時↓
主オブジェクトの共有設定↓
例:上記前提で、1のパターンと同じくプロファイルで下記権限付与
(主オブジェクトの共有設定は参照のみなので、プロファイルで参照以上の権限を付与しても参照のみとしかならない前提)
結果:主オブジェクトは参照のみ可能だが、従オブジェクトは作成/編集/削除可能となる
活動レコード
結論:
活動は関連先に紐づくため、ある意味では従レコードです。
ただし通常の主従とは全く異なる挙動になります。
詳しくは別記事で検証しています。