べにおブログ

学んだことを、ゆっくり深く。

レコードトリガーフローの実行タイミングを理解する

結論:まずこれだけ覚える

レコードトリガーフローは、何が起きたときに、保存処理のどの時点で動かすかを[開始]要素で決めます。

  • 保存前(高速項目更新):作成・更新されるトリガーレコード自身の項目値を、保存前に変更する
  • 保存後(アクションと関連レコード):保存後に、関連レコードの作成・更新、アクション、通知、スケジュール済みパスなどを実行する
  • 削除前/削除後:削除イベントでは、作成・更新の「高速項目更新」とは別の実行区分を使用する 保存前フローで使える要素については、Salesforceの現行公式ページ間に不整合があります。複数のページは4要素だけと説明する一方、別の現行ページは[カスタムエラー]も保存前フローで使用できると説明しています。

レコードトリガーフローとは

指定したオブジェクトのレコードが作成・更新・削除されたことをきっかけに、自動実行されるフローです。 [開始]要素では主に次を設定します。

  1. 対象オブジェクト
  2. 作成、更新、作成または更新、削除のどのイベントで実行するか
  3. エントリ条件
  4. 作成・更新の場合、保存前または保存後のどちらに最適化するか 削除イベントには、作成・更新の保存前フローとは別に、削除前と削除後のレコードトリガーフローがあります。

実行タイミングの比較

種類主な用途トリガーレコード自身関連レコード・アクション
保存前:高速項目更新保存前の値補正、計算、分類、入力エラー$Record の値を直接変更する原則として行わない
保存後:アクションと関連レコード関連レコードの作成・更新、メール、Apex、サブフロー、非同期処理必要に応じて更新要素を使用する実行できる
削除前削除されるレコードを参照して、削除前に必要な処理を行う削除対象として参照するフロー種別と要素の制約に従う
削除後レコード削除後に関連処理を行うすでに削除されたレコードの情報を参照する実行できる処理を設計する

保存前フロー:高速項目更新

保存前フローは、作成または更新されるレコードがデータベースへ保存される前に実行されます。 トリガーレコード自身の項目を変更する場合は、[割り当て]要素で $Record の項目へ値を設定します。通常、同じレコードを[レコードを更新]要素で保存し直す必要はありません。 向いている例は次のとおりです。

  • 郵便番号や電話番号の形式を補正する
  • 入力値から区分項目を計算する
  • 複数項目から初期値を設定する
  • 条件に合わない入力を[カスタムエラー]で止める 関連レコードの作成、メール送信、外部アクションなどが必要なら、保存後フローを使用します。

保存後フロー:アクションと関連レコード

保存後フローは、トリガーレコードの保存後に実行されます。 向いている例は次のとおりです。

  • 関連するToDoやカスタムオブジェクトレコードを作成する
  • 親レコードや子レコードを更新する
  • メールアラートや通知を送信する
  • Apexアクションやサブフローを呼び出す
  • 非同期パスやスケジュール済みパスを実行する スケジュール済みパスは、[アクションと関連レコード]に最適化したレコードトリガーフローで設定します。基準時刻から一定時間後、またはレコードの日付項目を基準に処理を予約できます。

削除イベントの扱い

「レコードが削除されたとき」を選ぶ場合、作成・更新用の[高速項目更新]と同じ考え方ではありません。 現行の公式[Flow Types]には、次の2種類が示されています。

  • Record-Triggered Before Delete Flow:レコードが削除対象としてマークされた時点で実行
  • Record-Triggered After Save Flow:レコード変更の保存後、またはレコード削除後に実行 削除前に削除対象の値を使って処理する、または削除後に関連データを更新するなど、目的に合わせてFlow Builderで利用可能な実行区分と要素を確認します。

保存前フローの利用可能要素に関する公式情報の不整合

Salesforce公式の[Before-Save Record-Triggered Flows]と[Flow Types]は、保存前フローで使用できる要素を次の4つと説明しています。

  • 割り当て(Assignment)
  • 決定(Decision)
  • レコードを取得(Get Records)
  • ループ(Loop) 一方、次の現行公式情報は保存前フローで[カスタムエラー]を使用できると説明しています。
  • [Custom Error Element]:保存前または保存後のレコードトリガーフローで利用可能
  • [Create a Before-Save Flow for Better Data Quality]:保存前フローへ[カスタムエラー]を追加する手順を掲載 したがって、「保存前フローでは現在も必ず4要素しか使えない」とは断定できません。設計時は現行のFlow Builderで利用可能な要素を確認し、試験問題では問題が前提とするリリース時点にも注意します。

保存前と保存後の選び方

要件選ぶ実行タイミング
保存するレコード自身の項目を計算・補正する保存前
入力エラーを表示して保存を止める保存前または保存後のカスタムエラー。単純な項目条件なら検証ルールも比較する
関連レコードを作成・更新する保存後
メールや通知を送る保存後
一定時間後に処理する保存後のスケジュール済みパス
削除前または削除後に処理する削除イベント用の実行区分

よくある誤解

保存前フローでは[レコードを更新]が必要

トリガーレコード自身の値は、$Record へ割り当てれば保存処理に反映されます。同じレコードを更新要素で再更新する設計は不要です。

保存後フローなら制約なく何でもできる

保存前より利用できる要素は広いですが、トランザクション、ガバナ制限、実行コンテキスト、再帰、要素ごとの制約はあります。要件に必要な処理だけを設計します。

削除フローも[高速項目更新]を選ぶ

削除イベントには削除前・削除後の実行区分があり、作成・更新の[高速項目更新]とは別に考えます。

試験での判別ポイント

  • 「保存するレコード自身の項目を高速に更新」→ 保存前の高速項目更新
  • 「関連レコードを作成」「メール送信」「サブフロー」→ 保存後のアクションと関連レコード
  • 「一定時間後に実行」→ 保存後のスケジュール済みパス
  • 「削除前に処理」→ 削除前レコードトリガーフロー
  • 「保存前で利用可能な要素は4つだけ」→ 現行公式情報に不整合があるため、出題時点の前提を確認

出典(Salesforce公式)

  • Getting Started with Record-Triggered Flows — レコードトリガーフローの対象イベント、エントリ条件、保存前・保存後の基本構成を裏付けています。
  • Before-Save Record-Triggered Flows — 保存前フローが作成・更新レコードの保存前に実行され、トリガーレコード自身を更新する用途であることと、4つの利用可能要素の説明を裏付けています。
  • Flow Types — 保存前、保存後、削除前など、現行のフロー種別と実行タイミングを裏付けています。
  • Custom Error Element — [カスタムエラー]が保存前または保存後のレコードトリガーフローで利用できるとする現行仕様を裏付けています。
  • Create a Before-Save Flow for Better Data Quality — 保存前フローに[カスタムエラー]を追加してデータ品質を検証する現行の手順を裏付けています。
  • Scheduled Paths — スケジュール済みパスが[アクションと関連レコード]に最適化したレコードトリガーフローで利用できることを裏付けています。