insert、update時にサーバーで処理される順番
★は同一オブジェクトに対して再度Apexトリガが実行される可能性のあるもの。
- データベースから元のレコードをロードするか、レコードを初期化する。
- 新しい項目値をロードし、古い値を上書きする。項目の必須・型・長さの検証。
- 高速項目更新のレコードトリガーフローの実行。
- Beforeトリガの実行。
- システム入力規則・カスタム入力規則の検証。
- 重複ルールの実行。
- レコードのデータベースへの保存(コミットはされない)。1
- Afterトリガの実行。★
- 割り当てルールの実行。
- 自動レスポンスルールの実行。
- ワークフロールールの実行。項目自動更新があるのみ、次の項目が実行される。★
- 再びレコードを更新する。
- システム検証を再度実行する(カスタム入力規則、フロー、重複ルール、プロセス、エスカレーションルールは再実行されない)。
- 1度のみBefore UpdateトリガとAfter Updateトリガの実行
- エスカレーションルールの実行。
- プロセス、プロセスによって開始されたフロー、ワークフロールールによって開始されたフローの実行(順不同)★
- アクションと関連レコードのレコードトリガフローの実行。
- エンタイトルメントルールの実行。
- 主オブジェクトの更新(積み上げ集計項目、クロスオブジェクトの項目自動更新)
- 主オブジェクトが更新された場合、主オブジェクトの種オブジェクトの更新(積み上げ集計項目、クロスオブジェクトの項目自動更新)
- 条件に基づく共有ルールの実行。
- DML操作のコミット。
- コミット後のロジックの実行(順不同)。
- メール送信
- キューに追加された非同期Apexジョブ(queueable、future)
- アウトバウンドメッセージ
- レコードトリガフローの非同期パス
再帰保存中、Salesforce は手順 9 (割り当てルール) から 17 (祖父母レコードの積み上げ集計項目) をスキップします。
留意事項
トランザクション
- 一連の処理の流れは1トランザクションとしてみなされます。そのためガバナ制限に注意する必要があります(CPU使用時間など)。
- 静的変数はトランザクションの範囲内で維持されます。そのため、同一トランザクションで複数回トリガが実行されるようなときに、静的変数を使用することで初回のみ処理を行うというようなことができます。(Apexでは、静的変数はトランザクションをまたいで使用することができず、トランザクション終了後に破棄されます)。
- たとえば、「従オブジェクトを保存→従オブジェクトのApexトリガ(1)→主オブジェクトの積み上げ集計項目が更新→主オブジェクトのApexトリガ(2)」の処理が行われたとき、(1)の静的変数は(2)でも維持されます。
静的変数は、Apex トランザクションの範囲内でのみ静的です。サーバ全体または組織全体で静的なわけではありません。静的変数の値は、1 回のトランザクションのコンテキスト内で保持され、トランザクションの境界を超えたときにリセットされます。たとえば、Apex DML 要求によってトリガが何回も起動される場合、これらのトリガ呼び出しを通して静的変数は保持されます。(Apex 開発者ガイド)
数式項目
- 数式項目は任意の方法で項目にアクセスするたびにその結果を計算しリアルタイムに表示します。
- ワークフロールールがその条件や式に数式項目を使用している場合、ワークフロールールの条件がチェックされたときに、その数式項目は計算されます。
- トリガのTrigger.oldはデータベースから元のレコードが読み込まれたとき、Trigger.newは要求から新しいレコード項目の値が読み込まれ、古い値を上書きされた時に計算されます。
保存前更新を実行するフロー
- 保存前更新を実行するフローが複数存在する場合、実行順序は制御できません。
- レコード所有者のみの変更では、レコードトリガフローは起動されません。
トリガ
- 同一オブジェクトに複数のトリガがある場合、実行順序は制御できません。
- 複数のトリガがあっても、triggerファイル単位で「Beforeトリガ処理→Afterトリガ処理」が行われるわけでなく、上記手順5.ですべてのBeforeトリガが実施され、上記手順9.ですべてのAfterトリガが実施されます。
- 項目自動更新やプロセスビルダーの項目更新、Afterトリガでのアップデートなどを行うと、再度トリガが実行されます。
- 同一トランザクションで、初回の実行時のみに処理を行いたい場合は、静的変数を利用します。
- BeforeInsert・AfterInsertのあとに再度トリガが実行された場合はBeforeUpdate・AfterUpdateが実施されます。
- 2回目以降のトリガ実行であっても、Trigger.oldはトランザクションの直前の値が使用されます(注:Insertトリガのあとに実施されるUpdateトリガでもTrigger.old、Trigger.oldMapにオブジェクトは格納されています)。
- BeforeトリガはDBに保存される前なので、BeforeInsert時は、作成日・作成者・最終更新日・最終更新者・自動採番項目・IDがnullとなります。BeforeUpdate時は、Trigger.newでも最終更新日・最終更新者の値が古いままとなります(ただし項目自動更新などで再度トリガが実施される場合のTrigger.newは最新の値)。
- Beforeトリガ・Afterトリガともに親の積上げ集計項目の計算より先に実行されます。なので、トリガの中で親の積上げ集計項目を参照するときは古い値になります。
- カスケード削除などではトリガは実行されない(トリガを呼び出さない操作 | Developer Guide)。
入力規則
- Insert時は、自動採番項目・ID項目・作成者・最終更新者はnull扱いとなります。
- Insert時は、作成日・最終更新日を使用した式は無視されます。2
- なので、特定の日付以降に作成されたレコードのみ入力規則を実施したい場合は
&& (DATEVALUE(CreatedDate) >= DATE(2020,05,06) || ISNEW())
のようにISNEW()
を併用する必要があります。
- なので、特定の日付以降に作成されたレコードのみ入力規則を実施したい場合は
- カスタム入力規則は、入力値ではなくbeforeトリガ後の値で評価されます。
- 入力規則は親の積上げ集計項目の計算より先に実行されます。なので、入力規則のなかで親の積上げ集計項目を参照するのは避けるべきです。主オブジェクトの入力規則で積上げ集計項目を使用するとつねに更新後の値で判定されます(従オブジェクトの更新で主オブジェクトの積上げ集計項目が更新されると主オブジェクトの入力規則が判定されます)。
積み上げ集計項目
- 親レコードに対する編集アクセス権限がない場合でも、親レコードが更新されます。
- 主オブジェクトの積み上げ集計項目が変更されるような従オブジェクトの更新は、主オブジェクトに対して上述の全処理フローが実施されます。
ワークフロー項目自動更新
- 同一オブジェクトに複数のワークフロー項目自動更新がある場合、実行順序は制御できません。
- ワークフロー項目自動更新でレコードが更新された場合、下記が実行されます(カスタム入力規則、フロー、重複ルール、ワークフロー、プロセスビルダーおよびエスカレーションルールは再実行されません)。
- 標準の入力規則
- BeforeUpdate トリガ
- AfterUpdate トリガ
- 時間依存のアクションに基づくワークフロー項目更新は、いかなるルールもトリガしません。
- 「項目変更後にワークフロールールを再評価する」にチェックをすると、更新が起きたレコードに対し、すべてのワークフロールールが検証され、条件を満たしているワークフローが実施されます。
- 変更前と変更後の値が一致しているときは項目自動更新が実施されないため、Apexトリガを再実行しません。
- 項目レベルセキュリティの影響を受けません。
クロスオブジェクトの項目自動更新
- 親レコードに対する編集アクセス権限がない場合でも、親レコードが更新されます。
- 主オブジェクトの積み上げ集計項目が変更されるような従オブジェクトの更新は、主オブジェクトに対して上述の全処理フローが実施されます。
プロセスビルダー
- 同一オブジェクトに複数のプロセスビルダーがある場合、実行順序は制御できません。
- 処理中に呼ばれたプロセスビルダーでレコードの更新が行われると、再度Apexトリガ、カスタム入力規則、重複ルール、エスカレーションルールが実行されます。
- 「この条件を評価した後の操作を指定」で「次の条件を評価」を選び、次のアクションで再度レコードを更新すると再度Apexトリガが実行されます。
- アクション「レコードの更新」は、項目レベルセキュリティの影響を受けません。
その他
リードの取引開始について
- リード設定 [取引開始済みのリードに入力規則が必須] を有効化しない限り、リードの取引開始時に上述の処理フローは実施されません。
承認プロセスについて
- 承認プロセスではクロスオブジェクトの項目自動更新を含めることはできません。
- 「項目変更後にワークフロールールを再評価する」の項目自動更新によって、ワークフロールールの判定が行われたとき、クロスオブジェクトの項目自動更新は実施されません。
- 承認プロセスによる項目自動更新ではカスタム入力規則は実施されません(idea)。
参考
- 全般
- トランザクション
- 数式項目
- 保存前更新を実行するフロー
- トリガ
- 入力規則
- 積上げ集計項目
- ワークフロールール
- プロセスビルダー