Apexでのレコード共有について(初心者向け)

Apexでのレコード共有とはどういうものか?

例えば、ユーザAに特定の取引先レコードBへの参照権限を付与したい場合、ユーザと取引先をそれぞれ参照するAccountShareレコードをInsertすることでユーザAに取引先Bの参照権限を付与することができる。

いつ使うのか?

OWD・ロール・共有ルールといった設定ベースでのアクセス権付与では対応しきれないとき。

例えば、レコードを共有したいユーザが共有元レコードの親の親である場合、共有ルールでは対応できないため、Apexによる共有レコードの自動作成がベストプラクティスとなる。

あるいはまた例えば、従業員1万人超えのエンタープライズ企業で毎日のように自社社員・契約社員などの入社やチーム異動がある場合、ユーザの作成・ロールの作成・公開グループの作成・ロールの変更・公開グループの変更・ロールに対する共有ルールの作成・公開グループに対する共有ルールの作成などを管理者が毎回手動で行うのは現実的ではないし、ささいな操作ミスで重大なインシデントに発展しかねない。

上記のような場合も、公開グループへの割り当てやレコード共有のApexによる自動化がベストプラクティスとなり得る。

とはいえ原則論として使わずに済むのであれば使わない方がよい

※時々、特定個人に特定のレコードを共有するユースケースを挙げる方を見かけるが、それは机上の空論である。確かにSalesforceの中だけでこの世界が完結していれば、そのような選択肢もあり得るのかもしれないが、現実的に「Apexで共有した後に、適切なタイミングでApex共有を解除する工数」と「口頭でぱっと情報を伝達する工数」を比較する必要がある。

※よくあるRecord Level Securityの図ではManual Sharing辺りに相当する。

画像元:https://trailhead.salesforce.com/ja/content/learn/modules/data_security/data_security_records

実際のコード(イメージ掴む用)

AccountShare acc_share = new AccountShare();
acc_share.accountId = アカウントのID;
acc_share.RowCause = 'Manual';
acc_share.UserOrGroupId = ユーザや公開グループなどのID;
acc_share.LeadAccessLevel = 'Read';
sharesToCreate.add(acc_share);

if(sharesToCreate.size()>0){
 insert sharesToCreate;
}

※上記のコードではRowCauseを’Manual’に設定していますが、実際には自由に設定可能です。RowCause==’Manual’は「共有の直接設定」の場合に自動設定される値であり、レコードの所有者の変更によって当該の共有が自動削除されるという特徴を持ちます。ApexでShareレコードを作成する際にRowCauseを’Manual’にするかどうかは、この仕様を使いまわしたいかどうかで決定します。

RowCauseの種別

共有パターンRowCause
取引先の共有ImplicitChild
関連するレコードの所有者または共有ImplicitParent
所有者Owner
商談チームTeam
共有ルールRule
テリトリー割り当てルールTerritoryRule
共有の直接設定Manual*
テリトリー直接設定TerritoryManual
開発者が定義開発者が定義

RowCauseが’Manual’の場合、レコードの所有者の変更によって当該の共有が自動削除される。

読むべき開発者ガイド

共有の理解

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

Apex による共有管理の再適用

Salesforce

Posted by regardie