Loading
Salesforce から送信されるメールは、承認済ドメインからのみとなります続きを読む

トリガーの更新前後の Trigger.old および Trigger.new の値

公開日: Mar 21, 2025
説明

この記事では、Salesforce レコードに変更を加える前と変更を加えた後に、Trigger.old と Trigger.new の値がどのように使用されるかについて説明します。Trigger.old と Trigger.new はコンテキスト変数です。

トリガーを起動したレコードにアクセスするには、コンテキスト変数を使用します。たとえば、Trigger.new には、Insert トリガーまたは Update トリガーで挿入されたすべてのレコードが含まれます。Trigger.old には、Update トリガーでは更新される前の sObject の古いバージョン、または削除トリガーでは削除された sObject のリストが含まれます。

トリガーは、1つのレコードが挿入されたとき、または API や Apex を介して多数のレコードが一括で挿入されたときに実行されます。そのため、Trigger.new などのコンテキスト変数には、1 つのレコードのみ、または複数のレコードが含まれます。 Trigger.new を反復処理することで、個々の sObject を取得できます。

解決策

ユースケース

  • 項目値が特定の値に変更された場合、 trigger.old と trigger.new を使用して、レコード上の項目値の古いバージョンと新しいバージョンの値を比較し、それに応じて必要なビジネスロジックを実行します。
  • trigger.old は Update イベントおよび Undelete トリガーでのみ使用でき、トリガーイベント前のレコードの古いバージョンを表します。
  • trigger.new は、Insert、Update、および Undelete トリガーでのみ使用でき、トリガーイベント後のレコードの新しいバージョンを表します。


シナリオの例

  • [説明] 項目などの項目を更新するオブジェクト作成 (たとえば、取引先) に関するワークフローがあります。
  • ワークフローの更新後に起動され、ワークフローによって変更された [説明] 項目を取得する trigger.old を繰り返すトリガーがあります。
  • この場合、nullpointerException が発生します。


根拠
その理由は、これらの 2 つのデータ構造によって保持されている値を理解するためです。

Trigger.old の値は、現在のトランザクションの前後 (ユーザ操作) で同じになります。 Trigger.new も同様です。

つまり、Trigger.old は更新後にワークフローによって新しく更新された項目を保持しません。ただし、手動でレコードを編集すると、トリガーが再び起動します (これは新しい「更新トランザクション」と見なされます)。 Trigger.old は、ワークフロールールによって前のトランザクションで更新された項目を保持します。

上記の例に戻ります。

ワークフローの更新後の Trigger.old の値には、ワークフローで更新された [説明] 項目が含まれません。

ワークフローの更新後の Trigger.new の値には、オブジェクトの作成時に設定された既存の項目とワークフローが更新した [説明] 項目が含まれます。

同じ項目を取得するには、ワークフロー項目自動更新が発生した後でデータベースをクエリする必要があります。

たとえば:

List<Account> accts = [Select Id, FieldUpdatedByWorkflow__c from Account where Id in : Trigger.old];



トリガーのサンプルを参照してください。

注: 取引先オブジェクトの作成に関するワークフロー項目自動更新を作成し、結果をデバッグログに表示します。

trigger testTrigger on Account (before update, after update, before insert, after insert) 
{
    if (Trigger.isBefore) {
        System.debug('********Trigger values***********');
        System.debug('***SFDC: Trigger.old is: ' + Trigger.old);
        System.debug('***SFDC: Trigger.new is: ' + Trigger.new);
    }
    
    if (Trigger.isAfter) {
        System.debug('********Trigger values***********');    
        System.debug('***SFDC: Trigger.old is: ' + Trigger.old);
        System.debug('***SFDC: Trigger.new is: ' + Trigger.new);
       
    }
}
ナレッジ記事番号

000384697

 
読み込み中
Salesforce Help | Article