Newer Version Available
トリガー
- insert
- update
- delete
- merge
- upsert
- undelete
たとえば、オブジェクトのレコードがデータベースに挿入される前、レコードが削除された後、またはレコードがごみ箱から復元された後に実行されるトリガーがあります。
Contact または Account、CaseComment などの一部の標準的な子オブジェクト、およびカスタムオブジェクトなど、トリガーをサポートする最上位の標準オブジェクトのトリガーを定義できます。トリガーにアクセスするオブジェクトのオブジェクト管理設定からトリガーを定義するには、[トリガー] に移動します。
- before トリガーは、レコードがデータベースに保存される前にレコードの値を更新または検証する場合に使用します。
- after トリガーは、システムによって設定された項目値 (レコードの Id や LastModifiedDate 項目など) にアクセスする場合や、監査テーブルへのログインやキューを使用した非同期イベントの実行など、他のレコードの変更に影響を及ぼす場合に使用します。after トリガーを実行するレコードは参照のみです。
トリガーは、最初にトリガーを実行したレコードと同じ種類の別のレコードを変更することもできます。たとえば、取引先責任者 A が更新された後でトリガーを実行する場合、このトリガーは取引先責任者 B、C、および D を変更することもできます。トリガーを使用して他のレコードを変更でき、これらの変更によってさらに複数のトリガーを実行できるために、Apex ランタイムエンジンはこうしたすべての操作を 1 つの作業単位とみなし、実行可能な操作数の制限を設定して無限に操作が反復されないようにします。「実行ガバナと制限」を参照してください。
さらに、before トリガーでレコードを更新または削除したり、after トリガーでレコードを削除したりすると、ランタイムエラーが発生します。これは、直接操作または間接操作のいずれの場合にも該当します。たとえば、取引先 A を更新し、取引先 A の更新 before トリガーが取引先責任者 B を挿入し、取引先責任者 B の挿入 after トリガーが取引先 A を照会して DML update ステートメントまたはデータベースメソッドを使用してその取引先を更新する場合、before トリガーで取引先 A を間接的に更新することになるため、ランタイムエラーが発生します。
実装に関する考慮事項
トリガーを作成する前に、次の点に留意してください。
- upsert トリガーは、必要に応じて before および after の insert トリガーまたは before および after の update トリガーを実行します。
- merge トリガーは、削除されるレコードには before および after の delete を実行し、保持されるレコードには before および after の update トリガーを実行します。「トリガーと Merge ステートメント」を参照してください。
- レコードが復元された後に実行するトリガーは、特定のオブジェクトでのみ機能します。「トリガーと復元レコード」を参照してください。
- トリガーが終了するまで、項目履歴は記録されません。トリガーで項目履歴を照会しても、現在のトランザクションの履歴は表示されません。
- 項目履歴管理では現在のユーザーの権限が優先されます。現在のユーザーにオブジェクトまたは項目を直接編集する権限がない場合は、履歴管理が有効になっているオブジェクトまたは項目を変更するトリガーを有効にしても、変更履歴は記録されません。
- 外部サービスからの応答を待機中のトリガープロセスがブロックされないように、コールアウトはトリガーから非同期に行う必要があります。非同期コールアウトをバックグラウンドプロセスで実行して、外部サービスから応答が返されたら受信します。非同期コールアウトを実行するには、future メソッドなどの非同期 Apex を使用します。詳細は、「Apex を使用したコールアウトの呼び出し」を参照してください。
- API バージョン 20.0 以前では、Bulk API 要求によってトリガーが起動されると、そのトリガーが処理する 200 レコードの各チャンクが、100 レコードのチャンクに分割されます。Salesforce API バージョン 21.0 以降では、API チャンクがさらに分割されることはありません。Bulk API 要求によって 200 レコードのチャンクに対してトリガーが複数回起動される場合、同じ HTTP 要求のこれらのトリガー呼び出しごとにガバナ制限がリセットされます。