今回は、「Apexトリガ」が何なのかいまいちよく分かっていない人のために、かつてApexトリガが分からなさ過ぎて涙したことがある私が可能な限り丁寧に解説します。
トリガは、開発の中でも比較的頻繁に使用する機能なので、まずはその構造をしっかり理解しましょう。
Apexトリガとは?
「トリガ」とは「引き金」のことです。
ピストルとかについてるあれです。
引き金を引くと銃弾が発射されますよね。
つまり、引き金を引くと何かが起こるということです。
Apexトリガもこれと同じ考えです。
引き金(トリガ)を作動させると、何かが起こるということなんです。
Apexトリガにおいてその引き金となるのが、オブジェクトのレコードが作成・更新・削除されたタイミングなのです。
Apexトリガとは、各オブジェクトのレコードの作成・更新・削除を引き金として、他の処理を実行できる仕組み
次は、トリガの構造を見ていきましょう。
Apexトリガの基本構造
トリガの構造は、いろいろなやり方があるとは思いますが、ここでは下の図のような構造を基本としておきます。

トリガはレコードの作成・更新・削除によって起動する引き金、ハンドラーはその引き金が引かれたことによって実行される処理(を書いておくApexクラス)と理解しておくと良さそうです。
レコードが作成・更新・削除されると、トリガがそのアクションを拾いハンドラークラスの実行したい処理が書かれているメソッドを呼び出します。
トリガ内に処理を直接書くことも可能ですが、後に新たに処理を追加する場合なども想定して、ハンドラークラスを使用するのがいいと思います。
トリガの起動タイミング
トリガには「Beforeトリガ」と「Afterトリガ」があります。
両者の違いは、レコードがDBに保存される前に実行されるか、後に実行されるかということです。
そして、以下のようなトリガの起動タイミングを指定することが可能です。
# | トリガ起動タイミング | 意味 |
---|---|---|
1 | before insert | レコードが作成される前 |
2 | before update | レコードが更新される前 |
3 | before delete | レコードが削除される前 |
4 | after insert | レコードが作成された後 |
5 | after update | レコードが更新された後 |
6 | after delete | レコードが削除された後 |
7 | after undelete | レコードが復元された後 |
例えば、「before insert」の場合、対象のオブジェクトのレコードがinsertされ、DBに保存される前にトリガが起動することになります。
「beforeトリガ」と「afterトリガ」についてはこちらの記事で詳しく説明していますので、あわせて読んでみてください。

実装例
さて、トリガの構造がなんとなくわかったところで、次は実際に処理を書いてみます。
下記のトリガおよびハンドラーでは取引先が作成された時に、その取引先に紐づく取引先責任者を作成する処理を実装しています。
トリガの実装
開発者コンソールを開き画面左上の「File」>「New」から「Apex Trigger」を選択します。

トリガ名を設定しオブジェクトを選択します。

さて、実際に書いてみましょう!

上のトリガではAccount(取引先)を対象オブジェクトとして指定し、トリガ起動タイミングを「after insert」に設定しています。(1行目)
これはつまり、Accountが新規作成され、DBに保存されたタイミングでこのトリガが起動するということです。
そして、4行目で呼び出したいメソッドを持つハンドラークラスをインスタンス化し、5行目でハンドラーのメソッドを呼び出しています。
その際、引数に「Trigger.new」を指定しています。
Trigger.newというのは、トリガコンテキス変数と呼ばれるもので、ここではinsertされたAccountレコードのリストと考えてもらえると理解しやすいと思います。
参考:「トリガコンテキスト変数」
ハンドラーの実装
続いてハンドラーを実装します。
開発者コンソール画面左上の「File」>「New」から「Apex Class」を選択します。

クラス名を設定します。

作成したハンドラークラスに処理を書いていきます。
- 引数を受け取る(3行目)
- 実行したい処理を書く(3行目以降)

ハンドラーではトリガ側で指定した、createContactメソッドが呼ばれ、引数として渡された「trigger.new」の値が、accListに入ってきます。(3行目)
その値を使用して取引先責任者を作成していきます。
おわりに
今回は、「Apexトリガ」についてざっくりと解説しました。
トリガはいろいろ応用が効き、非常に実用性のある機能なのですが、最初のうちは難しく感じてしまうこともあるかもしれません。
まずは構造を理解することから始めるといいのかなと思います。
コメント
コメント一覧 (3件)
こちらの記事から拝見させて頂きました。
分かりやすくて大変ためになります。
1点教えて頂ければ幸いなのですが、自分がApex トリガで呼び出したい
箇所をEXCELの「マクロの記録」のように調べる方法はありますでしょうか。
具体的には、ケースのパブリッシャーからメールメッセージを作成するときに
HTML形式をテキスト形式につつ、メール本文の入力欄を大きくしたいのですが
対象オブジェクトがケースなのか、ケースが呼び出す?メールパブリッシャーなのか
そういう非常に凄く初歩的なところで分からなくなってしまい、教えて頂ければ幸いです。
坂本様
記事をご覧になってくださりありがとうございます。
いただきましたご質問に関してですが、
ケースオブジェクトのレコードになんらかの処理(作成、更新、削除)が実行されたタイミングで、メールに対してアクションを起こしたいのであれば、
トリガの対象オブジェクト(起動タイミングのオブジェクト)はケースということになります。
ただ、私自身、ケースやメール周辺の開発経験が乏しいため、処理実行対象のオブジェクトに関しては十分な解答を差し上げれないというのが本音です。。。
どうしても早期の解決が必要になるようでしたらSalesforce のサポートに問い合わせてみるのがいいかもしれません。
あまりお役に立てずに申し訳ございません。
以上、よろしくお願いいたします。
早速お返事頂きありがとうございます。助かります。
サポートは聞き方間違えるとドキュメントURLでごめんなさいメールになるので
自分でももう少し色々勉強したいと思います。
余談ですが半年ちょっとかけて自社環境のservice cloudを一人で構築して少しは経験したものの
後から後から「そうだったんだ」という事ばかり出てきて同じような仕事をされている
皆さんもこのようなご苦労されているんですねぇ・・・。
畑違いの自分としては頭が下がる思いです。。