開発システムアーキテクチャSalesforce システム共有設定アーキテクチャ

共有設定アーキテクチャ

Salesforceのレコード共有設定の全体アーキテクチャと、各レイヤーの役割を解説します。


Salesforce共有設定の階層構造

Salesforceのレコード共有は、以下の階層で制御されます(上から順に適用):

📌

重要な原則: 共有設定は常に追加的です。一度付与されたアクセス権限を、下位のレイヤーで剥奪することはできません(Object Permissions, Profile, Permission Setは例外)。


1. Organization-Wide Defaults (OWD)

概要

組織全体のデフォルト共有設定。すべてのオブジェクトに対して設定されます。

本システムでの設定

主要なオブジェクトは、最も厳格な設定を採用:

オブジェクトInternal SharingExternal Sharing意味
Design_Family_Name__cPrivatePrivate所有者のみアクセス可能
Product__cPrivatePrivate所有者のみアクセス可能
Maker_Code__cPrivatePrivate所有者のみアクセス可能
My_Catalog__cReadWritePrivate内部: 全員が編集可能
外部: 所有者のみ
Room_Design__cReadWritePrivate内部: 全員が編集可能
外部: 所有者のみ

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 Admin
ℹ️

Portal 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)

  1. Allow Access by R. Modeling Team(条件ベース)

    • 条件: Allow_Access_by_R_Modeling_Team__c = True
    • 共有先: R.Design Support Team
    • アクセスレベル: Edit
  2. Allow Access by Other Brand Users(条件ベース)

    • 条件: Allow_Access_by_Other_Brand_Users__c = True
    • 共有先: All Partner Users
    • アクセスレベル: Read Only
  3. AMOCC PTE. LTD.(所有者ベース)

    • 所有者: Executives(内部ユーザー)
    • 共有先: AMOCC PTE. LTD. Portal Role
    • アクセスレベル: Edit

Opportunity

  1. 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(アクセス許可):

ObjectAccess Determined ByAccess Level
AccountUser.Contact.Account = Account.Owner.AccountRead/Write
Associated MaterialUser.Account = Associated Material.Owner.AccountRead/Write
Associated ProductsUser.Account = Associated Products.Owner.AccountRead/Write
Attribute Option VisualUser.Account = Attribute Option Visual.Owner.AccountRead/Write
CategoryUser.Account.Customer_Users_Access_to_Default_Data__c = Category.Owner_Account__cRead Only
Manage Store ViewUser.Account = Manage Store View.Owner.AccountRead/Write
Product AttributeUser.Account = Product Attribute.Owner.AccountRead/Write
Vendor BrandUser.Account = Vendor Brand.Owner_Account__cRead/Write
デザイン・ファミリーUser.Account = デザイン・ファミリー.Maker_Code__c.Owner_Account__cRead/Write

Sharing Set Settingsの利点

  1. 直感的な設定: Account-based sharingをGUIで設定可能
  2. Profile/Permission Set連動: ユーザーのProfileを変更するだけで共有設定が自動適用
  3. 複数オブジェクト対応: 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で実現されています。


共有設定の優先順位と累積効果

累積的なアクセス権限

例:

  1. OWD = Private → 所有者のみアクセス可能
  2. Sharing Rule → 特定のRoleに Read権限を追加
  3. Sharing Set → 同じAccountのユーザーに Edit権限を追加
  4. 最終結果: 同じAccountのユーザーは Edit権限、特定のRoleは Read権限

より強い権限が優先

User A に対する権限:
  - Sharing Rule: Read
  - Sharing Set: Edit
  
最終的な権限: Edit(より強い権限)

トラブルシューティング:「なぜアクセスできないのか?」

診断手順

  1. OWDを確認

    Setup → Sharing Settings → Organization-Wide Defaults
    • Private設定か?
  2. 所有者を確認

    SELECT Id, Name, OwnerId, Owner.Name
    FROM Design_Family_Name__c
    WHERE Id = 'a1x...'
  3. Sharing Rulesを確認

    Setup → Sharing Settings → Sharing Rules for Design Family
    • 適用される条件ベースルールがあるか?
    • ユーザーのRoleは正しいか?
  4. Sharing Set Settingsを確認

    Setup → Sharing Settings → Sharing Set Settings
    • ユーザーのProfileに紐付いたSharing Setがあるか?
    • Account IDが一致しているか?
  5. Manual Sharingを確認

    SELECT Id, UserOrGroupId, AccessLevel, RowCause
    FROM Design_Family_Name__Share
    WHERE ParentId = 'a1x...'

関連ドキュメント


更新履歴

  • 2026年1月21日: 初版作成