レコードレベルのセキュリティの設定を行う場合、大体は共有設定やロール階層の設定で設定する側の作業は終わりで、後は使う側が直接共有をすることがほとんどだと思います。こういったレコード共有の情報はどこで管理されているのでしょうか?
#Shareオブジェクト
Salesforceには、レコードの共有を管理するオブジェクトとして、各オブジェクトごとにShareオブジェクトなるものが存在しています。ShareオブジェクトのAPI名は以下のようにされています。
標準オブジェクトの場合:AccountShare, OpportunityShare, ContactShare, etc...
カスタムオブジェクトの場合:CustomObject名__Share
項目は以下の通りです。詳しくはこちらを参照してください。
項目 | データ型 | 説明 |
---|---|---|
ParentID | 参照 | 共有するレコードのIDです。 |
UserOrGroupId | 参照 | 共有先のユーザ・グループのIDです。 |
AccessLevel | picklist | レコードへどの程度アクセスできるのかを指定します。 値は以下の通りです。 Read:参照可能 Edit:編集可能 All:すべて可能 |
RowCause | picklist | 共有の理由です。主な値は以下の通りです。 Manual Owner Rule ... 以上の値以外の独自の理由も設定することができるらしいです。(Apex共有の理由) |
通常はレコードの所有者が変更されれば、共有は解除されてしまいます。
しかし、RowCauseに独自の理由を設定した場合は、所有者の変更では共有が解除されません。
このオブジェクトのレコードをどうにかして作成すれば、個人に対するレコードの共有ができるわけです。
このレコードを作成する方法はいくつか考えられます。
- Data Loaderなどで、Shareオブジェクトのレコードを作成する。
- Apexトリガを用いて、Shareオブジェクトのレコードを作成する。(これなら、個人レベルの共有も自動化できます。)
- フローを用いて、Shareオブジェクトのレコードを作成する。(後述)
#フローを使って共有を自動化する
レコードトリガーフローを使用して、Shareオブジェクトのレコードを作成することで、特定の状況におけるレコードの共有を自動化することができます。なんでもできるなフロー君
8/31に開催されたSalesforceの共有設定をマスターしよう! 〜 Sharing & Visibility〜にて示された例を借りて、実際にやってみます。
####シチュエーション
応募者に対して面接官(Salesforceユーザ)を設定した際、その面接官も応募者レコードを参照できるようにしたい。
####解決
レコード保存後のトリガーフローをします。
トリガー条件としては、「面接官項目が空白ではない・条件に一致する度にトリガ」でいいと思います。
キャンバスに配置する要素は「レコードを作成」要素だけでいいでしょう。面接官の変更とかを考慮すると、他の要素も検討したほうがいいんじゃないかなって思いますが。面倒なので今回はスルーしますが。
後は、この要素と開始要素を結んでフローを保存・有効化でOK!
フローを実際に動かす前に、応募者オブジェクトの組織の共有設定を「非公開」にしておきましょう。
組織の共有設定で付与したアクセス権限以下のアクセス権限は付与できません。(すでに組織の共有設定で付与されている為。)
####動作確認
実際に動かしてみましょう。まだ面接官を設定していない応募者・クックさんのレコードがあります。
共有階層から、アクセスできる人を確認できます。アクセスできる人は下画像の通りです。(モザイクは私自身の名前が入っています。)
では、面接官をベネットさんに設定しましょう。
共有階層から、アクセスできる人を確認すると…
このレコードにアクセスできる人にベネットさんが追加されました。うまく共有をかけられたようですね。
#あとがき
Salesforceの共有設定をマスターしよう! 〜 Sharing & Visibility〜に参加して、初めて共有オブジェクトなるものの存在を知り、フローでもレコード共有の設定ができると聞いて、早速試してみました。いやはやこんなことまで出来るのか、と感心までしてしまいましたね。
記事に書くための検証をしていた時に、フローを組んで有効化していざ動作確認!って動作させたら、「INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY: insufficient access rights on cross-reference id」
ってエラーが出たんですよね。
ちょうどSalesforce Saturdayに参加していたのでSOSを投げたのですが、その後に新しくPlaygroundを立ち上げてもう一回やりなおしたら、うまくいきました。Salesforce Saturdayに参加していた皆様、お騒がせして申し訳ありませんでした。