Apex を使用したレコードの共有
プログラムから共有にアクセスするには、共有する標準オブジェクトまたはカスタムオブジェクトに関連付けられている共有オブジェクトを使用する必要があります。たとえば、AccountShare は Account オブジェクトの共有オブジェクト、ContactShare は Contact オブジェクトの共有オブジェクトです。さらに、すべてのカスタムオブジェクトの共有オブジェクトには次のように名前が付けられています。MyCustomObject はカスタムオブジェクトの名前です。
MyCustomObject__Share
主従関係の従側にあるオブジェクトには、関連付けられた共有オブジェクトはありません。従レコードへのアクセスは、主の共有オブジェクトと関係の共有設定により定義されます。詳細は、Salesforce オンラインヘルプの「カスタムオブジェクトのセキュリティ」を参照してください。
共有オブジェクトには、共有管理、ユーザ共有管理、Apex 共有管理の 3 種類の共有すべてをサポートするレコードが含まれています。組織の共有設定、ロールの階層、および特定オブジェクトの「すべて表示」や「すべて変更」などの権限、「すべてのデータの参照」および「すべてのデータの編集」を使用してユーザに暗黙的に付与された共有は、このオブジェクトでは追跡されません。
各共有オブジェクトには、次のプロパティがあります。
| プロパティ名 | 説明 |
|---|---|
| objectNameAccessLevel | 共有 sObject に対し、指定されたユーザまたはグループが権限を与えられたアクセスレベル。プロパティ名は、オブジェクト名に AccessLevel が追加したものです。 たとえば、LeadShare オブジェクトのプロパティ名は LeadShareAccessLevel です。有効な値は、次のとおりです。
|
| ParentID | オブジェクトの ID。この項目は更新できません。 |
| RowCause | ユーザまたはグループにアクセス権が付与される理由。この理由によって、共有のタイプが決まります。共有のタイプは、共有レコードの変更権限を制御します。この項目は更新できません。 |
| UserOrGroupId | アクセス権を付与するユーザまたはグループの ID。次のグループを指定できます。
この項目は更新できません。 |
ユーザまたはグループでは標準オブジェクトまたはカスタムオブジェクトは共有できません。オブジェクトを共有できるユーザおよびグループの種別についての詳細は、『Salesforce のオブジェクトリファレンス』の「User」と「Group」を参照してください。
Apex を使用したユーザ共有管理の作成
Apex による共有管理の作成
開発者は Apex による共有管理を使用すると、Apex または SOAP API を通じて、アプリケーションの動作をサポートする共有をプログラムで操作できるようになります。この種類の共有は、共有管理に類似しています。「すべてのデータの編集」権限を持つユーザのみが、レコードへの Apex による共有管理を追加または変更できます。Apex による共有管理は、レコードの所有者を変更しても維持されます。
Apex による共有管理には、Apex 共有の理由を使用する必要があります。Apex 共有の理由は、ユーザやユーザグループでレコードを共有した理由を開発者が追跡するための 1 つの方法です。複数の Apex 共有理由を使用することで、共有レコードの更新や削除に必要なコーディングを簡略化することができます。また、開発者は、同じユーザやグループに対して異なる共有理由を設定して複数の共有を設定できます。
- ユーザインターフェースでレコードの共有を参照すると、[理由] 列に表示ラベルが表示されます。この表示ラベルにより、ユーザとシステム管理者が共有の目的を理解できます。表示ラベルは、トランスレーションワークベンチを使用する翻訳についても有効化されます。
- この名前は、API および Apex で理由を参照するときに使用します。
Apex 共有の理由の名前の形式は次のとおりです。
詳細は、「System.Schema クラス」を参照してください。
- カスタムオブジェクトの管理設定から、[Apex 共有の理由] 関連リストの [新規] をクリックします。
- Apex 共有の理由の表示ラベルを入力します。ユーザインターフェースでレコードの共有を参照すると、[理由] 列に表示ラベルが表示されます。表示ラベルは、トランスレーションワークベンチを使用する翻訳についても有効化されます。
- Apex 共有の理由の名前を入力します。この名前は、API および Apex で理由を参照するときに使用します。この名前は、アンダースコアと英数字のみを使用でき、組織内で一意にする必要があります。最初は文字であること、空白は使用しない、最後にアンダースコアを使用しない、2 つ続けてアンダースコアを使用しないという制約があります。
- [保存] をクリックします。
Apex による共有管理の例
この例では、人事採用アプリケーションの構築中で、Job というオブジェクトが存在すると仮定しています。ジョブにリストされた採用担当者および採用担当マネージャにレコードへのアクセス権が付与されていることを確認したいと考えています。次のトリガは、ジョブレコード作成時に採用担当者および採用担当マネージャにアクセス権を付与します。この例では、User レコードと関連付けられた、Hiring_Manager および Recruiter という 2 つの参照項目を持つ Job というカスタムオブジェクトが必要です。また、Job カスタムオブジェクトには、Hiring_Manager と Recruiter という 2 つの共有の理由を追加する必要があります。
- 共有の直接設定アクセスレベルが「参照」に設定されている場合に、「更新」に設定された新しい共有行を挿入します。元の共有行はより高いアクセスレベルを示す「更新」に更新されます。
- ユーザは子レコード (取引先責任者、ケース、商談など) にアクセスできるため、取引先にアクセスできます。取引先共有ルールが作成されている場合、共有ルールの共有理由 (より高いアクセスレベル) によって親の暗黙的共有の共有理由が置き換えられ、高い方のアクセスレベルを示します。
カスタマーコミュニティプラスユーザのための Apex による共有管理の作成
カスタマーコミュニティプラスユーザは以前、カスタマーポータルユーザと呼ばれていました。これらのユーザは、共有オブジェクト (AccountShare、ContactShare など) を使用できません。カスタマーコミュニティプラスユーザとして共有オブジェクトを使用する必要がある場合は、デフォルトで without sharing キーワードを使用して動作するトリガの使用を検討してください。または、この同じキーワードで内部クラスを使用し、DML 操作を正常に実行できるようにします。別のユーティリティクラスを使用してこのアクセスを有効にすることもできます。
記述した共有の直接設定または Apex による共有を介した共有オブジェクトに対する表示の許可はサポートされていますが、オブジェクト自体をカスタマーコミュニティプラスユーザが使用することはできません。ただし、他のユーザは共有を追加してカスタマーコミュニティプラスユーザにアクセス権を付与することができます。