この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Apex を使用したレコードの共有

可能な場合は、Equality の会社の値に一致するように、含めない用語を変更しました。顧客の実装に対する影響を回避するために、一部の用語は変更されていません。

重要

プログラムから共有にアクセスするには、共有する標準オブジェクトまたはカスタムオブジェクトに関連付けられている共有オブジェクトを使用する必要があります。たとえば、AccountShare は Account オブジェクトの共有オブジェクト、ContactShare は Contact オブジェクトの共有オブジェクトです。さらに、すべてのカスタムオブジェクトの共有オブジェクトには次のように名前が付けられています。MyCustomObject はカスタムオブジェクトの名前です。

MyCustomObject__Share

主従関係の従側にあるオブジェクトには、関連付けられた共有オブジェクトはありません。従レコードへのアクセスは、主の共有オブジェクトと関係の共有設定により定義されます。詳細は、Salesforce オンラインヘルプの「カスタムオブジェクトのセキュリティ」を参照してください。

共有オブジェクトには、共有管理、ユーザ共有管理、Apex 共有管理の 3 種類の共有すべてをサポートするレコードが含まれています。組織の共有設定、ロールの階層、および特定オブジェクトの「すべて表示」や「すべて変更」などの権限、「すべてのデータの参照」および「すべてのデータの編集」を使用してユーザに暗黙的に付与された共有は、このオブジェクトでは追跡されません。

各共有オブジェクトには、次のプロパティがあります。

プロパティ名 説明
objectNameAccessLevel 共有 sObject に対し、指定されたユーザまたはグループが権限を与えられたアクセスレベル。プロパティ名は、オブジェクト名に AccessLevel が追加したものです。 たとえば、LeadShare オブジェクトのプロパティ名は LeadShareAccessLevel です。有効な値は、次のとおりです。
  • Edit
  • Read
  • All

All アクセスレベルは内部の値であり、付与できません。

メモ

この項目には、その親オブジェクトに割り当てられた組織のデフォルトアクセスレベルよりも高いアクセスレベルを割り当てる必要があります。詳細は、「共有の理解」を参照してください。
ParentID オブジェクトの ID。この項目は更新できません。
RowCause ユーザまたはグループにアクセス権が付与される理由。この理由によって、共有のタイプが決まります。共有のタイプは、共有レコードの変更権限を制御します。この項目は更新できません。
UserOrGroupId アクセス権を付与するユーザまたはグループの ID。次のグループを指定できます。
  • ロールに関連付けられた公開グループまたは共有グループ。
  • テリトリーグループ。

この項目は更新できません。

Apex を使用して認証されていないゲストユーザにアクセス権を付与することはできません。

メモ

ユーザまたはグループでは標準オブジェクトまたはカスタムオブジェクトは共有できません。オブジェクトを共有できるユーザおよびグループの種別についての詳細は、Salesforce のオブジェクトリファレンス「User」「Group」を参照してください。

Apex を使用したユーザ共有管理の作成

Apex または SOAP API を使用して、1 つのユーザまたはグループに対してレコードの共有を直接設定できます。レコードの所有者が変更されると、共有は自動的に削除されます。次の例のクラスには、参照アクセスのある特定のユーザまたはグループ ID を伴うジョブ ID によって指定されたジョブを共有するメソッドが含まれます。また、このメソッドを検証するテストメソッドも含まれます。このクラス���を保存する前に、Job というカスタムオブジェクトを作成します。

Apex を使用して記述された共有の直接設定には、デフォルトで RowCause="Manual" が含まれます。所有権が変更されると、この条件の共有のみが削除されます。

メモ

組織のデフォルトのアクセスレベルは、最も権限の大きいアクセスレベルに設定することはできません。カスタムオブジェクトの場合、このレベルは「公開/参照・更新可能」です。詳細は、「共有の理解」を参照してください。

重要

Apex による共有管理の作成

開発者は Apex による共有管理を使用すると、Apex または SOAP API を通じて、アプリケーションの動作をサポートする共有をプログラムで操作できるようになります。この種類の共有は、共有管理に類似しています。「すべてのデータの編集」権限を持つユーザのみが、レコードへの Apex による共有管理を追加または変更できます。Apex による共有管理は、レコードの所有者を変更しても維持されます。

Apex による共有管理には、Apex 共有の理由を使用する必要があります。Apex 共有の理由は、ユーザやユーザグループでレコードを共有した理由を開発者が追跡するための 1 つの方法です。複数の Apex 共有理由を使用することで、共有レコードの更新や削除に必要なコーディングを簡略化することができます。また、開発者は、同じユーザやグループに対して異なる共有理由を設定して複数の共有を設定できます。

Apex 共有の理由は、オブジェクトの詳細ページとして定義されます。Apex 共有の理由には、それぞれラベルと名前が付けられます。
  • ユーザインターフェースでレコードの共有を参照すると、[理由] 列に表示ラベルが表示されます。この表示ラベルにより、ユーザとシステム管理者が共有の目的を理解できます。表示ラベルは、トランスレーションワークベンチを使用する翻訳についても有効化されます。
  • この名前は、API および Apex で理由を参照するときに使用します。

Apex 共有の理由の名前の形式は次のとおりです。

Apex 共有の理由は、次のようにプログラムで参照できます。
たとえば、Job というオブジェクトの Apex 共有の理由である Recruiter は、次のように参照できます。

詳細は、「System.Schema クラス」を参照してください。

Apex 共有の理由を作成する手順は、次のとおりです。
  1. カスタムオブジェクトの管理設定から、[Apex 共有の理由] 関連リストの [新規] をクリックします。
  2. Apex 共有の理由の表示ラベルを入力します。ユーザインターフェースでレコードの共有を参照すると、[理由] 列に表示ラベルが表示されます。表示ラベルは、トランスレーションワークベンチを使用する翻訳についても有効化されます。
  3. Apex 共有の理由の名前を入力します。この名前は、API および Apex で理由を参照するときに使用します。この名前は、アンダースコアと英数字のみを使用でき、組織内で一意にする必要があります。最初は文字であること、空白は使用しない、最後にアンダースコアを使用しない、2 つ続けてアンダースコアを使用しないという制約があります。
  4. [保存] をクリックします。

Apex 共有の理由と Apex による共有管理の再適用は、カスタムオブジェクトでのみ使用できます。

メモ

Apex による共有管理の例

この例では、人事採用アプリケーションの構築中で、Job というオブジェクトが存在すると仮定しています。ジョブにリストされた採用担当者および採用担当マネージャにレコードへのアクセス権が付与されていることを確認したいと考えています。次のトリガは、ジョブレコード作成時に採用担当者および採用担当マネージャにアクセス権を付与します。この例では、User レコードと関連付けられた、Hiring_Manager および Recruiter という 2 つの参照項目を持つ Job というカスタムオブジェクトが必要です。また、Job カスタムオブジェクトには、Hiring_Manager と Recruiter という 2 つの共有の理由を追加する必要があります。

特定の状況下では、共有行を挿入すると、既存の共有行が更新されます。次の例を参考にしてください。
  • 共有の直接設定アクセスレベルが「参照」に設定されている場合に、「更新」に設定された新しい共有行を挿入します。元の共有行はより高いアクセスレベルを示す「更新」に更新されます。
  • ユーザは子レコード (取引先責任者、ケース、商談など) にアクセスできるため、取引先にアクセスできます。取引先共有ルールが作成されている場合、共有ルールの共有理由 (より高いアクセスレベル) によって親の暗黙的共有の共有理由が置き換えられ、高い方のアクセスレベルを示します。

組織のデフォルトのアクセスレベルは、最も権限の大きいアクセスレベルに設定することはできません。カスタムオブジェクトの場合、このレベルは「公開/参照・更新可能」です。詳細は、「共有の理解」を参照してください。

重要

カスタマーコミュニティプラスユーザのための Apex による共有管理の作成

カスタマーコミュニティプラスユーザは以前、カスタマーポータルユーザと呼ばれていました。これらのユーザは、共有オブジェクト (AccountShareContactShare など) を使用できません。カスタマーコミュニティプラスユーザとして共有オブジェクトを使用する必要がある場合は、デフォルトで without sharing キーワードを使用して動作するトリガの使用を検討してください。または、この同じキーワードで内部クラスを使用し、DML 操作を正常に実行できるようにします。別のユーティリティクラスを使用してこのアクセスを有効にすることもできます。

記述した共有の直接設定または Apex による共有を介した共有オブジェクトに対する表示の許可はサポートされていますが、オブジェクト自体をカスタマーコミュニティプラスユーザが使用することはできません。ただし、他のユーザは共有を追加してカスタマーコミュニティプラスユーザにアクセス権を付与することができます。

デジタルエクスペリエンスを有効にすると、Apex による共有管理を介して「ロール & 下位ロール」にアクセスできるレコードは、「ロール、内部 & ポータル下位ロール」に自動的にアクセスできるようになります。外部ユーザのアクセスを保護するには、Apex コードを更新して、[ロール & 内部下位ロール] グループへの共有を作成できるようにします。この変換は大規模な操作であるため、Apex の一括処理を使用することを検討してください。

警告