今回は「beforeトリガとafterトリガの違い」についてです。
いつまでってもなかなか頭に残ってくれない、、、
その都度調べるのもありだとは思いますが、いい加減頭にしっかり刻みこみたい。ということで両者の違いと、その他補足事項をまとめました。
そもそもトリガってなーに?っていう人はこちらも参考人してみてください。
beforeトリガとafterトリガの違い
beforeトリガとafterトリガの違いは端的に言うと、下記のようになります。
- beforeトリガ:レコードがDBに保存される前に起動
- afterトリガ:レコードがDBに保存された後に起動(※コミットはまだされていない)
beforeトリガは、レコードがDBに保存される前なので、「trigger.new」を直接変更することが可能です。
afterトリガは、レコードがDBに保存された後に起動するので、「作成者」や「最終更新日時」などのシステムによって設定される値を利用することができます。
ちなみにDBに保存はされているけどコミットがされていないというのは、DBに対して行われたinsertやupdateなどの更新処理が、まだ確定していないことを意味します。
起動タイミング | trigger.newの項目値の変更 | システム情報(Idや作成日時)の使用 | |
---|---|---|---|
beforeトリガ | DBに保存される前 | 〇(before insert、before updateの場合) | × |
afterトリガ | DBに保存された後 | × | 〇 |
トリガの起動タイミング
トリガの起動タイミングには以下のようなパターンがあります。
- before insert
- before update
- before delete
- after insert
- after update
- after delete
- after undelete
例えば、「before insert」の場合、対象のオブジェクトのレコードがinsertされ、DBに保存される前にトリガが起動することになります。
「undelete」は、ごみ箱からのレコードの復元なので、afterしかありませんね。
あまり使ったことはないですが、頭の片隅に入れておきます。
参考:トリガコンテキスト変数
トリガの実行順序
Salesforce内には、トリガだけでなく、ワークフローやプロセスビルダー、入力規則などの自動で処理を実行するような機能が多く備わっています。
そして、それらの機能には処理が実行される順番があり、その順番をある程度理解して開発を進めていかないと、思うようにシステムが動いてくれなかったりするわけです。
以下、開発でよく使用しそうな自動化プロセスの順序になっているので参考にしてみてください。
- beforeトリガ
- 入力規則
- 重複ルール
- レコードの保存(コミットはまだだよ)
- afterトリガ
- ワークフロールール
- プロセスビルダー
- 積み上げ集計
- 条件に基づく共有の評価の実行
- DBのコミット
beforeトリガとafterトリガの使い分け
さて、ここまで「beforeトリガ」と「afterトリガ」の違いや、起動タイミングについてお伝えしてきましたが、結局どんな時にどっちを使えばいいの?って話ですよね。
いろいろ考えはあるとは思いますが、こんな感じ(↓)に押さえておけば問題ないかなと思います。
- insert/updateされたレコードを、DBに保存される前に操作したい
もしくは、入力規則のチェックより前に処理を実行したい → 「beforeトリガ」 - DBに保存された後のレコードにアクセスしたい → 「afterトリガ」
まとめ
今回は「beforeトリガとafterトリガの違い」についてお伝えしました。
それぞれの違いだけでなく、自動化処理の実行順序も頭に入れておくと開発が少しは楽になりそうですね。
コメント