Apexでのレコード共有とはどういうものか?
例えば、ユーザAに特定の取引先レコードBへの参照権限を付与したい場合、ユーザと取引先をそれぞれ参照するAccountShareレコードをInsertすることでユーザAに取引先Bの参照権限を付与することができる。
いつ使うのか?
OWD・ロール・共有ルールといった設定ベースでのアクセス権付与では対応しきれないとき。
例えば、レコードを共有したいユーザが共有元レコードの親の親である場合、共有ルールでは対応できないため、Apexによる共有レコードの自動作成がベストプラクティスとなる。
あるいはまた例えば、従業員1万人超えのエンタープライズ企業で毎日のように自社社員・契約社員などの入社やチーム異動がある場合、ユーザの作成・ロールの作成・公開グループの作成・ロールの変更・公開グループの変更・ロールに対する共有ルールの作成・公開グループに対する共有ルールの作成などを管理者が毎回手動で行うのは現実的ではないし、ささいな操作ミスで重大なインシデントに発展しかねない。
上記のような場合も、公開グループへの割り当てやレコード共有のApexによる自動化がベストプラクティスとなり得る。
とはいえ原則論として使わずに済むのであれば使わない方がよい。
※時々、特定個人に特定のレコードを共有するユースケースを挙げる方を見かけるが、それは机上の空論である。確かにSalesforceの中だけでこの世界が完結していれば、そのような選択肢もあり得るのかもしれないが、現実的に「Apexで共有した後に、適切なタイミングでApex共有を解除する工数」と「口頭でぱっと情報を伝達する工数」を比較する必要がある。
※よくあるRecord Level Securityの図ではManual Sharing辺りに相当する。
実際のコード(イメージ掴む用)
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’の場合、レコードの所有者の変更によって当該の共有が自動削除される。