Skip to main content
Build the future with Agentforce at TDX in San Francisco or on Salesforce+ on March 5–6. Register now.

Abonnieren von Änderungsereignissen mithilfe eines Apex-Auslösers

Lernziele

Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:

  • Schreiben eines Apex-Auslösers zum Abonnieren von Änderungsereignissen
  • Erzeugen von Änderungsereignisbenachrichtigungen durch Vornehmen von Änderungen in Salesforce
  • Überprüfen Sie Debug-Protokollmeldungen zum Auslöser im Debug-Protokoll.
Hinweis

Hinweis

Lernen Sie auf Deutsch? Beginnen Sie die Aufgabe in einem Trailhead Playground in der Sprache Deutsch und verwenden Sie für die Navigation die in Klammern angegebenen Übersetzungen. Kopieren und fügen Sie nur die Angaben in Englisch ein, da zur Überprüfung der Aufgabe Daten in Englisch benötigt werden. Wenn Sie die Aufgabe in Ihrer deutschen Organisation nicht bestehen, empfehlen wir Ihnen folgende Vorgehensweise: (1) Stellen Sie das Gebietsschema auf USA um, (2) legen Sie Englisch als Sprache fest (Anweisungen dazu finden Sie hier) und (3) klicken Sie erneut auf die Schaltfläche "Check Challenge" (Aufgabe überprüfen).

Weitere Details dazu, wie Sie die übersetzte Trailhead-Umgebung optimal nutzen können, finden Sie unter dem Badge "Trailhead in Ihrer Sprache".

Sie wissen jetzt, wie Sie Änderungsereignisse mit der Pub/Sub-API anbonnieren. Apex-Auslöser sind eine weitere Möglichkeit zum Abonnieren von Änderungsereignissen. Lassen Sie uns mehr darüber in Erfahrung bringen.

Asynchrone Apex-Auslöser für Änderungsereignisse

Sie können auf der Lightning-Plattform mithilfe von Apex-Auslösern Änderungsereignisse abonnieren. Apex-Auslöser für Änderungsereignisse ähneln Apex-Auslösern für Salesforce-Objekte, weisen jedoch einige Unterschiede auf. Wie ein Apex-Auslöser für Salesforce-Objekte definieren Sie einen Änderungsereignisauslöser für das dem Salesforce-Objekt entsprechende Änderungsereignis. Nur "after insert"-Auslöser werden unterstützt: 

Definieren Sie einen Änderungsereignisauslöser mit dem Schlüsselwort after insert für das Änderungsereignis im folgenden Format.

trigger TriggerName on ChangeEventName (after insert) {
}

Hier ist ein Beispiel für das AccountChangeEvent-Objekt, das "Account" entsprechende Änderungsereignis.

trigger MyAccountChangeTrigger on AccountChangeEvent (after insert) {
}

Der Änderungsereignisauslöser wird aktiviert, wenn ein einzelnes bzw. ein Batch von Änderungsereignissen empfangen wird. Im Gegensatz zu Objektauslösern werden Änderungsereignisauslöser nach Abschluss der Datenbanktransaktion asynchron ausgeführt. Durch die asynchrone Ausführung eignen sich Änderungsereignisse ideal für die Verarbeitung ressourcenintensiver Geschäftslogik unter Beibehaltung der transaktionsbasierten Logik im Objektauslöser. Durch das Entkoppeln der Verarbeitung von Änderungen können Änderungsereignisauslöser dazu beitragen, die Transaktionsverarbeitungszeit zu verkürzen.

Änderungsereignisauslöser haben diese Merkmale.

  • Sie werden unter der Einheit "Automatisierter Prozess" ausgeführt. Daher werden Debug-Protokolle für den Auslöser von der Einheit "Automatisierter Prozess" erstellt, und Systemfelder wie CreatedById und OwnerId verweisen auf "Automatisierter Prozess".
  • Sie unterliegen den synchronen Obergrenzen von Apex.
  • Sie haben eine maximale Batchgröße von 2.000 Ereignisnachrichten (die Anzahl der Elemente in Trigger.New).

Datensatz- und Header-Felder von Apex-Änderungsereignissen

Da Felder in einer Änderungsereignisnachricht statisch definiert sind, sind wie bei jedem anderen Apex-Typ alle Datensatzfelder vorhanden. Apex-Änderungsereignisnachrichten können leere Felder (NULL) enthalten. Unveränderte Felder sind NULL, ebenso wie Felder, die bei einer Aktualisierung explizit auf NULL festgelegt werden. 

Um herauszufinden, welche Felder geändert wurden, verwenden Sie das Header-Feld changedFields. Sie enthält eine Liste der Datensatzfelder, die bei einem Aktualisierungsvorgang geändert wurden. Der Beispielauslöser in dieser Einheit zeigt, wie mithilfe des Felds changedFields bestimmt werden kann, welche Felder aktualisiert oder gelöscht wurden.

Hinweis

Das Header-Feld changedFields steht für Apex-Änderungsereignisauslöser zur Verfügung, die mit der API-Version 47.0 oder höher gespeichert wurden.

Erstellen eines Änderungsereignisauslösers

Das Hinzufügen eines Änderungsereignisauslösers erfolgt genauso einfach wie das Hinzufügen eines Auslösers für ein Salesforce-Objekt. Sie erstellen in der Developer Console einen Auslöser für das Änderungsereignis, das dem benutzerdefinierten Objekt "Employee" zugeordnet ist, das Sie zuvor erstellt haben. Das System erstellt das Änderungsereignisobjekt Employee__ChangeEvent, wenn Sie ein benutzerdefiniertes Objekt anlegen. 

Hinweis

Für die folgenden Schritte ist es erforderlich, dass Sie zuerst das benutzerdefinierte Objekt Employee__c erstellen. Befolgen Sie die Schritte in der vorherigen Einheit zum Erstellen dieses benutzerdefinierten Objekts. 

So erstellen Sie den Änderungsereignisauslöser in der Developer Console:

  1. Klicken Sie auf das Schnellzugriffsmenü (Schnellzugriffsmenü).
  2. Klicken Sie auf Developer Console.
  3. Wählen Sie in der Developer Console File | New | Apex Trigger aus.
  4. Geben Sie in das Feld "Name" einen Namen für den Auslöser ein: EmployeeChangeTrigger.
  5. Wählen Sie in der Dropdown-Liste das Änderungsereignisobjekt für das benutzerdefinierte Objekt "Employee" aus: Employee__ChangeEvent. Der Auslöser wird mit dem Schlüsselwort after insert erstellt.
  6. Ersetzen Sie den Standardinhalt durch den folgenden Code.
trigger EmployeeChangeTrigger on Employee__ChangeEvent (after insert) {
  List<Task> tasks = new List<Task>();
  // Iterate through each event message.
  for (Employee__ChangeEvent event : Trigger.New) {
    // Get some event header fields
    EventBus.ChangeEventHeader header = event.ChangeEventHeader;
    System.debug('Received change event for ' +
      header.entityName +
      ' for the ' + header.changeType + ' operation.');
    // For update operations, we can get a list of changed fields
    if (header.changetype == 'UPDATE') {
        System.debug('List of all changed fields:');
        for (String field : header.changedFields) {
            if (null == event.get(field)) {
                System.debug('Deleted field value (set to null): ' + field);
            } else {
                System.debug('Changed field value: ' + field + '. New Value: '
                    + event.get(field));
            }
        }
    }
    // Get record fields and display only if not null.
    System.debug('Some Employee record field values from the change event:');
    if (event.First_Name__c != null) {
      System.debug('First Name: ' + event.First_Name__c);
    }
    if (event.Last_Name__c != null) {
      System.debug('Last Name: ' + event.Last_Name__c);
    }
    if (event.Name != null) {
      System.debug('Name: ' + event.Name);
    }
    if (event.Tenure__c != null) {
      System.debug('Tenure: ' + event.Tenure__c);
    }
    // Create a followup task
    Task tk = new Task();
    tk.Subject = 'Follow up on employee record(s): ' +
    header.recordIds;
    tk.OwnerId = header.CommitUser;
    tasks.add(tk);
  }
  // Insert all tasks in bulk.
  if (tasks.size() > 0) {
    insert tasks;
  }
}

Dieser Änderungsereignisauslöser iteriert durch jede empfangene Änderungsereignisnachricht in Trigger.New. Für jedes Ereignis erhält der Auslöser einige Header-Felder. Wenn der Vorgang eine Aktualisierung ist, ruft der Auslöser auch durch Zugriff auf den Header-Wert changedFields die Liste der Felder ab, die geändert wurden. Als Nächstes zeigt der Auslöser Werte von Datensatzfeldern an, falls diese nicht NULL sind. Schließlich erstellt er eine Folgeaufgabe für neue Datensätze des Typs "Employee".

Hinweis

Auf der Benutzeroberfläche können Sie Änderungsereignisauslöser nur in der Developer Console erstellen. Änderungsereignisobjekte sind nicht in Lightning Experience im Objekt-Manager oder in Salesforce Classic in Setup aufgeführt. 

Überprüfen der Ausführung von Änderungsereignisauslösern

Lassen Sie uns nun manuell überprüfen, ob der Auslöser funktioniert. Um Ereignisnachrichten im Auslöser zu empfangen, aktivieren Sie das Objekt zurest auf der Seite "Datenänderungserfassung" in Setup. In einem früheren Schritt haben Sie bereits Benachrichtigungen für "Employee" aktiviert, sodass Sie diesen Schritt hier überspringen können. Da Debug-Protokolle unter der Einheit "Automatisierter Prozess" erstellt werden, aktivieren Sie Debug-Protokolle in Setup für diese Entität, damit Protokolle gesammelt werden können.

  1. Um Setup in einer neuen Registerkarte zu öffnen, klicken Sie auf das Schnellzugriffsmenü (Schnellzugriffsmenü) und anschließend auf Setup.
  2. Geben Sie unter "Setup" im Feld "Schnellsuche" den Text Debug-Protokolle ein und wählen Sie dann Debug-Protokolle aus.
  3. Klicken Sie auf Neu.
  4. Wählen Sie Automatisierter Prozess für "Typ der verfolgten Einheit" aus.
  5. Wählen Sie den Zeitraum für die Protokollerfassung aus. Das Start- und Ablaufdatum entspricht standardmäßig dem aktuellen Datum und der aktuellen Uhrzeit. Verlängern Sie das Ablaufdatum, indem Sie auf das Eingabefeld für das Enddatum klicken und den nächsten Tag im Kalender auswählen.
  6. Klicken Sie für "Debugebene" auf Neue Debugebene. Geben Sie CustomDebugLevel als Name ein und übernehmen Sie die Standardeinstellungen.
  7. Klicken Sie auf Save (Speichern).

Lassen Sie die Setup-Seite "Debug-Protokolle" geöffnet, da Sie in Kürze zu ihr zurückkehren. Nehmen Sie als Nächstes einige Änderungen in Salesforce vor, um den Änderungsereignisauslöser zu aktivieren. Erstellen Sie einen "Employee"-Datensatz und aktualisieren Sie ihn.

  1. Klicken Sie auf einer neuen Registerkarte auf den App Launcher (App Launcher) und dann auf Employees.
  2. Klicken Sie auf Neu.
  3. Füllen Sie die folgenden Felder aus.
    • Employee Name (Mitarbeitername): e-200
    • Last Name (Nachname): Smith
    • First Name (Vorname): Joseph
    • Tenure (Anstellungsdauer): 1
  1. Klicken Sie auf Speichern.
  2. Klicken Sie auf der Detailseite des "Employee"-Datensatzes auf Bearbeiten.
  3. Ändern Sie das Feld "First Name" in Joe.
  4. Löschen Sie den Wert für "Tenure".
  5. Klicken Sie auf Speichern.
  6. Wechseln Sie zur Registerkarte "Debug-Protokolle" und aktualisieren Sie den Browser.
  7. Um die Debug-Protokolle anzuzeigen, die der Datensatzerstellung entsprechen, klicken Sie in der Liste neben dem zweiten Protokoll auf Anzeigen (das neueste Protokoll befindet sich in der Sortierung ganz oben). Die Ausgabe der System.debug-Anweisungen sieht in etwa so aus.
...|DEBUG|Received change event for Employee__c for the CREATE operation.
...|DEBUG|Some Employee record field values from the change event:
...|DEBUG|First Name: Joseph
...|DEBUG|Last Name: Smith
...|DEBUG|Name: e-200
...|DEBUG|Tenure: 1.0
  1. Um die Debug-Protokolle anzuzeigen, die der Datensatzaktualisierung entsprechen, klicken Sie in der Liste neben dem ersten Protokoll auf "Anzeigen". Die Ausgabe der System.debug-Anweisungen sieht in etwa so aus. Da das System das Feld LastModifiedDate beim Aktualisieren des Datensatzes aktualisiert, ist dieses Feld als Teil der geänderten Felder aufgeführt.
...|DEBUG|Received change event for Employee__c for the UPDATE operation.
...|DEBUG|List of all changed fields:
...|DEBUG|Changed field value: LastModifiedDate. New Value: 2019-09-26 20:53:29
...|DEBUG|Changed field value: First_Name__c. New Value: Joe
...|DEBUG|Deleted field value (set to null): Tenure__c
...|DEBUG|Some Employee record field values from the change event:
...|DEBUG|First Name: Joe

Glückwunsch! Sie haben einen Änderungsereignisauslöser geschrieben und überprüft, ob er auf der Benutzeroberfläche einwandfrei funktioniert. In der nächsten Lektion erfahren Sie, wie Sie einen Apex-Test für den Änderungsereignisauslöser schreiben, um das Testen Ihres Auslösers zu automatisieren.

Ressourcen

Teilen Sie Ihr Trailhead-Feedback über die Salesforce-Hilfe.

Wir würden uns sehr freuen, von Ihren Erfahrungen mit Trailhead zu hören: Sie können jetzt jederzeit über die Salesforce-Hilfe auf das neue Feedback-Formular zugreifen.

Weitere Infos Weiter zu "Feedback teilen"