Mark Hammer's Blog

SalesforceやTrailheadに関する情報を投稿しているブログです。

フローのコンテキストによる動作の違い

はじめに

フローのコンテキストには以下の3つがあります。

  • ユーザコンテキスト
    • レコードアクセス権は組織の共有設定、ロール階層等によって決まる。(ユーザが見えないレコードはフローでも取得できない)
    • 実行ユーザのプロファイルおよび権限セットによって、フローのオブジェクト権限および項目レベルのアクセス権が決まる。
  • システムコンテキスト(共有あり)
    • レコードアクセス権は組織の共有設定、ロール階層等によって決まる。(ユーザが見えないレコードはフローでも取得できない)
    • 実行ユーザのプロファイルおよび権限セットは無視され、フローはシステム権限でアクセス可能な全オブジェクト、全項目にアクセスできる。
  • システムコンテキスト(共有なし)
    • システム権限でレコードにアクセスする。(ユーザが見えないレコードでもフローで取得可)
    • 実行ユーザのプロファイルおよび権限セットは無視され、フローはシステム権限でアクセス可能な全オブジェクト、全項目にアクセスできる。

フロー画面での表示

このフローのコンテキストの動作の違いを明確にする機会がありましたので、実際に動作を調べた結果を書いていきます。

調査

概要

まずは以下の画面フローを作成します。

フローチャート

そして以下の条件それぞれで画面フローを実行し、どのような動作になるかを確認します。

  • レコードAをフロー実行ユーザが「見える/見えない」
    • レコードBはフロー実行ユーザが「見える」で固定
  • 「産業コード」項目をフロー実行ユーザが「読み書き不可/読みのみ可/読み書き可」
  • フローコンテキストが「ユーザ/システム(共有あり)/システム(共有なし)」

結果

レコードAが 「産業コード」項目の
アクセス権限
コンテキスト
ユーザ システム(共有あり) システム(共有なし)
見えない 読み書き不可 項目アクセス不可による
レコード取得時エラー
正常終了するが
レコードAの項目値を
取得できないため
空データで更新
正常更新
見えない 読みのみ可 項目アクセス不可による
レコード更新時エラー
正常終了するが
レコードAの項目値を
取得できないため
空データで更新
正常更新
見えない 読み書き可 正常終了するが
レコードAの項目値を
取得できないため
空データで更新
正常終了するが
レコードAの項目値を
取得できないため
空データで更新
正常更新
見える 読み書き不可 項目アクセス不可による
レコード取得時エラー
正常更新 正常更新
見える 読みのみ可 項目アクセス不可による
レコード更新時エラー
正常更新 正常更新
見える 読み書き可 正常更新 正常更新 正常更新

おまけ

今回の投稿はTrailheadの Secure Application Lifecycle Management Superbadge Unit にて"We can't find the expected running contexts for the 'Product Creation' and 'Price Book Entry Creation' flows"エラーがすぐ解決できなかったことが原因でした。 trailhead.salesforce.com

このエラーは以下のTrailblazer Communityでの投稿でも多くのユーザを悩ませているようです。
Trailblazer Community: Secure Application Lifecycle Management Superbadge Unit

前述の調査結果の通り、ユーザのオブジェクトアクセス・項目アクセス権限を適用する場合はユーザコンテキスト、オブジェクトアクセス・項目アクセス権限を無視したい場合はシステムコンテキストということ、そして権限は必要最低限のものを与える(「共有あり」、「共有なし」どちらでもいいなら「共有あり」を選ぶ)を理解すれば解けます。
私のように「項目アクセスできなくてもフローによる更新が必要?よしシステムコンテキスト(共有なし)を適用だ」という思考ではダメです。

参考資料