共有設定アーキテクチャ
Salesforceのレコード共有設定の全体アーキテクチャと、各レイヤーの役割を解説します。
Salesforce共有設定の階層構造
Salesforceのレコード共有は、以下の階層で制御されます(上から順に適用):
重要な原則: 共有設定は常に追加的です。一度付与されたアクセス権限を、下位のレイヤーで剥奪することはできません(Object Permissions, Profile, Permission Setは例外)。
1. Organization-Wide Defaults (OWD)
概要
組織全体のデフォルト共有設定。すべてのオブジェクトに対して設定されます。
本システムでの設定
主要なオブジェクトは、最も厳格な設定を採用:
| オブジェクト | Internal Sharing | External Sharing | 意味 |
|---|---|---|---|
| Design_Family_Name__c | Private | Private | 所有者のみアクセス可能 |
| Product__c | Private | Private | 所有者のみアクセス可能 |
| Maker_Code__c | Private | Private | 所有者のみアクセス可能 |
| My_Catalog__c | ReadWrite | Private | 内部: 全員が編集可能 外部: 所有者のみ |
| Room_Design__c | ReadWrite | Private | 内部: 全員が編集可能 外部: 所有者のみ |
Private の意味
Private (非公開):
- レコード所有者(Owner)のみがアクセス可能
- 他のユーザーは、追加の共有設定なしではアクセス不可
- 最も厳格な設定なぜPrivateを選択したのか
目的: マルチテナント完全分離
Brand A のユーザー
↓ Private設定
Brand A が所有するレコードのみ閲覧可能
↓
Brand B のレコードは完全に隔離されるトレードオフ
externalSharingModel = Private により、同じブランド内のユーザー間でも自動的には共有されません。そのため、Sharing RulesやSharing Set Settingsで明示的に共有設定を追加する必要があります。
2. Role Hierarchy(ロール階層)
概要
上位ロールのユーザーは、下位ロールのユーザーが所有するレコードに自動的にアクセス可能です。
Internal User向けロール階層
Executives(経営陣)
└─ Managers(管理者)
└─ Standard Users(一般ユーザー)Portal Role Hierarchy(Experience Cloud)
Community Userには、Portal Roleが割り当てられます。
主要なPortal Role:
AMOCC PTE. LTD.(システム管理会社)R.Design Support Team(サポートチーム)[Brand Name] Standard(各ブランド)
階層の例:
R.Design Support Team
└─ Brand A Standard
└─ Brand A Staff
AMOCC PTE. LTD.
└─ AMOCC AdminPortal Role Hierarchyは、Sharing RulesとSharing Set Settingsの sharedTo 設定で使用されます。
3. Sharing Rules(共有ルール)
概要
特定の条件に基づいて、レコードを自動的に共有する仕組み。
本システムでの使用状況
157個のSharing Rulesファイルが存在し、各オブジェクトに複数のルールが設定されています。
Sharing Rulesの種類
A. Owner-based Sharing Rules(所有者ベース)
所有者のロールやグループに基づいて共有。
例: Design Family
<sharingOwnerRules>
<fullName>AMOCC_PTE_LTD</fullName>
<accessLevel>Edit</accessLevel>
<label>AMOCC PTE. LTD. パートナー ユーザ</label>
<sharedTo>
<portalRoleAndSubordinates>AMOCCPTELTD</portalRoleAndSubordinates>
</sharedTo>
<sharedFrom>
<roleAndSubordinates>Excecutives</roleAndSubordinates>
</sharedFrom>
</sharingOwnerRules>意味:
- Executives(内部ユーザー)が所有するDesign Familyレコードを
- AMOCC PTE. LTD. Portal Roleとその配下のユーザーに
- Edit権限で共有
B. Criteria-based Sharing Rules(条件ベース)
レコードの項目値に基づいて共有。
例: Design Family
<sharingCriteriaRules>
<fullName>Allow_Access_by_R_Modeling_Team</fullName>
<accessLevel>Edit</accessLevel>
<label>Allow Access by R. Modeling Team</label>
<sharedTo>
<portalRoleAndSubordinates>RDesignSupportTeam</portalRoleAndSubordinates>
</sharedTo>
<criteriaItems>
<field>Allow_Access_by_R_Modeling_Team__c</field>
<operation>equals</operation>
<value>True</value>
</criteriaItems>
<includeRecordsOwnedByAll>true</includeRecordsOwnedByAll>
</sharingCriteriaRules>意味:
Allow_Access_by_R_Modeling_Team__c = TrueのDesign Familyレコードを- R.Design Support Team Portal Roleとその配下のユーザーに
- Edit権限で共有
- 所有者に関係なく適用
主要オブジェクトのSharing Rules例
Design Family (Design_Family_Name__c)
-
Allow Access by R. Modeling Team(条件ベース)
- 条件:
Allow_Access_by_R_Modeling_Team__c = True - 共有先: R.Design Support Team
- アクセスレベル: Edit
- 条件:
-
Allow Access by Other Brand Users(条件ベース)
- 条件:
Allow_Access_by_Other_Brand_Users__c = True - 共有先: All Partner Users
- アクセスレベル: Read Only
- 条件:
-
AMOCC PTE. LTD.(所有者ベース)
- 所有者: Executives(内部ユーザー)
- 共有先: AMOCC PTE. LTD. Portal Role
- アクセスレベル: Edit
Opportunity
- Share Room Design record type with Support Team(条件ベース)
- 条件: RecordType = “Room Design” OR “Modeling/Styling”
- 共有先: R.Design Support Team
- アクセスレベル: Read
4. Sharing Set Settings(Experience Cloud専用)
概要
Experience Cloud(旧Community Cloud)でのみ使用可能な共有設定。Profile または Permission Set に紐付けて設定します。
重要: “Sharing Sets”(Partner Community専用)と “Sharing Set Settings”(Customer Community対応)は異なる機能です。本システムでは Sharing Set Settings を使用しています。
設定場所
Setup → Digital Experiences → [Site Name] → Workspaces → Administration
→ Members → Sharing Setsまたは
Setup → Sharing Settings → Sharing Set Settings本システムでの使用例
Maker Community User Sharing Set
適用対象: Profile “R Design | Maker Community User”
Access Granted(アクセス許可):
| Object | Access Determined By | Access Level |
|---|---|---|
| Account | User.Contact.Account = Account.Owner.Account | Read/Write |
| Associated Material | User.Account = Associated Material.Owner.Account | Read/Write |
| Associated Products | User.Account = Associated Products.Owner.Account | Read/Write |
| Attribute Option Visual | User.Account = Attribute Option Visual.Owner.Account | Read/Write |
| Category | User.Account.Customer_Users_Access_to_Default_Data__c = Category.Owner_Account__c | Read Only |
| Manage Store View | User.Account = Manage Store View.Owner.Account | Read/Write |
| Product Attribute | User.Account = Product Attribute.Owner.Account | Read/Write |
| Vendor Brand | User.Account = Vendor Brand.Owner_Account__c | Read/Write |
| デザイン・ファミリー | User.Account = デザイン・ファミリー.Maker_Code__c.Owner_Account__c | Read/Write |
Sharing Set Settingsの利点
- 直感的な設定: Account-based sharingをGUIで設定可能
- Profile/Permission Set連動: ユーザーのProfileを変更するだけで共有設定が自動適用
- 複数オブジェクト対応: 1つのSharing Setで複数のオブジェクトを設定可能
制約事項
❌ 複雑なリレーションシップパスは使用不可
// 不可
User.Contact.Account = Design_Family.Maker_Code__r.Owner.Account✅ 直接ルックアップフィールドのみ使用可能
// 可能
User.Contact.Account = Design_Family.Maker_Code__r.Owner_Account__cこれが Owner_Account__c カスタムフィールドが必要な理由です。
5. Manual Sharing(手動共有)
概要
ユーザーが個別に、特定のレコードを他のユーザーやグループと共有する機能。
使用例
- 特定のDesign Familyを、一時的に別のブランドのユーザーと共有
- プロジェクト関係者に、関連するOpportunityレコードを共有
確認方法
レコード詳細ページ → Sharing Button → "Share"または、SOQLでSharing Objectを確認:
SELECT Id, ParentId, UserOrGroupId, AccessLevel, RowCause
FROM Design_Family_Name__Share
WHERE ParentId = 'a1x...'6. Apex Managed Sharing
概要
Apexコードを使用して、プログラムで動的に共有設定を行う仕組み。
実装方法
Sharing Objectへのレコード挿入:
// 例: Design Familyの共有
Design_Family_Name__Share dfShare = new Design_Family_Name__Share();
dfShare.ParentId = designFamilyId;
dfShare.UserOrGroupId = userId;
dfShare.AccessLevel = 'Edit';
dfShare.RowCause = Schema.Design_Family_Name__Share.RowCause.Manual;
insert dfShare;本システムでの使用状況
現在、一部のトリガーやバッチ処理で使用されている可能性がありますが、主な共有設定はSharing RulesとSharing Set Settingsで実現されています。
共有設定の優先順位と累積効果
累積的なアクセス権限
例:
- OWD = Private → 所有者のみアクセス可能
- Sharing Rule → 特定のRoleに Read権限を追加
- Sharing Set → 同じAccountのユーザーに Edit権限を追加
- 最終結果: 同じAccountのユーザーは Edit権限、特定のRoleは Read権限
より強い権限が優先
User A に対する権限:
- Sharing Rule: Read
- Sharing Set: Edit
最終的な権限: Edit(より強い権限)トラブルシューティング:「なぜアクセスできないのか?」
診断手順
-
OWDを確認
Setup → Sharing Settings → Organization-Wide Defaults- Private設定か?
-
所有者を確認
SELECT Id, Name, OwnerId, Owner.Name FROM Design_Family_Name__c WHERE Id = 'a1x...' -
Sharing Rulesを確認
Setup → Sharing Settings → Sharing Rules for Design Family- 適用される条件ベースルールがあるか?
- ユーザーのRoleは正しいか?
-
Sharing Set Settingsを確認
Setup → Sharing Settings → Sharing Set Settings- ユーザーのProfileに紐付いたSharing Setがあるか?
- Account IDが一致しているか?
-
Manual Sharingを確認
SELECT Id, UserOrGroupId, AccessLevel, RowCause FROM Design_Family_Name__Share WHERE ParentId = 'a1x...'
関連ドキュメント
- 前のステップ: データモデル - オブジェクト間の関係性
- 次のステップ: 共有メカニズム - 具体的な実装
- 詳細: トラブルシューティング - 問題診断
更新履歴
- 2026年1月21日: 初版作成