この記事では Apexトリガ について、以下のことを説明しています。
- before insert と after insert で何が変わるのか
- どういう用途で使い分ければ良いのか
データベースに保存される前か後かの違い
ポイントはデータベースへの保存です。
処理の流れとして、before insert の実行後に、 データベースへの保存(コミットはされない)が行われ、その後 after insert が実行されます。
具体的に何が変わるか?
間にデータベースへの保存が入ることで、以下のことが変わります。
Trigger.newを使った項目値の変更ができなくなる
Trigger.new とは新しいバージョンの sObject レコードのリストを返すトリガコンテキスト変数です。
before insert では Trigger.new を使ってレコードの項目値を変更することができますが、データベース保存後の after insert ではTrigger.new を使った項目値の変更はできません。
ただし、after insert では update / delete DML 操作を使用した元オブジェクトの更新・削除は可能です。
レコードにIDが設定される
データベースに保存されることで、レコードのIDや作成日時などの項目にアクセスすることができるようになります。特に、IDが設定されることで以下のことが可能になります。
- 他レコードの参照/主従関係項目として設定できる
- Trigger.newMap が使えるようになる
Trigger.newMap とは、新しいバージョンの sObject レコードに対して、キーをID、値をレコードとした Map です。キーがIDなので before insert では使えず、 after insert で使うことができます。
まとめ
今回言及した特徴を踏まえると、それぞれのトリガの基本的な役割としては以下のようになります。
before insert
- レコードの項目値の変更
- レコードの項目値のチェック
after insert
- 参照/主従関係の設定(他レコードの更新)
コメント