Loading

Fehler „Mixed DML Operation“ (Gemischte DML-Operation) beim Erstellen oder Aktualisieren von Datensätzen über den Prozessgenerator oder eine Validierungsregel

Veröffentlichungsdatum: Mar 3, 2021
Beschreibung


DML-Operationen auf bestimmte sObjects, die manchmal als Setup-Objekte bezeichnet werden, können nicht mit DML auf andere sObjects in derselben Transaktion gemischt werden. Diese Einschränkung besteht, weil einige sObjects den Zugriff des Benutzers auf Datensätze in der Organisation beeinflussen. Sie müssen diese Arten von sObjects in einer anderen Transaktion einfügen oder aktualisieren, um zu verhindern, dass Vorgänge mit falschen Zugriffsberechtigungen durchgeführt werden. Sie können zum Beispiel nicht einen Account und eine Benutzerrolle in einer einzigen Transaktion aktualisieren.
 

Beispiel 1: 

Wenn Sie mit einem Prozess versuchen, beide Aktionen in einer einzigen Transaktion auszuführen, wird ein Fehler angezeigt.

Fehler: An error occurred at element myRule_1_A1 (FlowRecordCreate). (Beim Element myRule_1_A1 (FlowRecordCreate) ist ein Fehler aufgetreten.)
INSERT --- INSERT FAILED --- ERRORS : (MIXED_DML_OPERATION) DML operation on setup object is not permitted after you have updated a non-setup object (or vice versa): Invoice_Statement__c, original object: User (INSERT --- INSERT FAILED --- ERRORS : (MIXED_DML_OPERATION) DML-Vorgang für eingerichtetes Objekt nach Aktualisierung eines nicht eingerichteten Objekts nicht zulässig (oder umgekehrt): Invoice_Statement__c, ursprüngliches Objekt: Benutzer)

Schritte zum Reproduzieren:

1. Erstellen Sie einen Prozess auf dem Benutzerobjekt.
2. Stellen Sie die Kriterien auf „Aktiv“ | „ist gleich“ | „Wahr“ ein.
3. Legen Sie als sofortige Aktion „Datensatz erstellen“ für das Objekt „Account“ fest.
4. Aktivieren Sie den Prozess.
5. Erstellen und aktivieren Sie einen neuen Benutzer.
 

Beispiel 2: 

Wenn Sie mithilfe einer Validierungsregel versuchen, Benutzer- und Kontaktobjekte zu aktualisieren, wie im folgenden Anwendungsfall:

  • Sie haben einen Authentifizierungsanbieter und einen RegistrationHandler für die Anmeldung von Community-Benutzern.
  • RegistrationHandler.updateUser() aktualisiert das Benutzerobjekt.
  • Der Benutzer hat eine Validierungsregel mit einer Formel, die auf den Kontakt verweist.
  • In RegistrationHandler updateUser() wird das Benutzerobjekt aktualisiert.

Validierungsregel:

IF( Community_User_s_Account_ID__c== $Setup.COMM_Profile__c.BluIdAccountId__c , IF( OR(ProfileId== $Setup.COMM_Profile__c.FullAccessProfile__c ,ProfileId== $Setup.COMM_Profile__c.BasicProfileId__c) , true, false),false) Community_User_s_Account_ID__c ist ein Formelfeld in User, um den Wert von „Contact.AccountId“ zu erhalten


Beim Anmelden erhält der Benutzer eine Fehlermeldung:

„... you cannot mix EntityObjects with different UddInfos within one transaction: id = 003********“ (Sie können keine EntityObjects mit verschiedenen UddInfos innerhalb einer Transaktion mischen: id = 003********)

oder genauer gesagt:

„We can’t log you in because of the following error.“ (Sie können aufgrund des folgendes Fehlers nicht angemeldet werden)
ERROR_CREATING_USER: Validation Formula "UserProfileSwitchRule" Invalid (java.lang.IllegalStateException: Programmer Error: you cannot mix EntityObjects with different UddInfos within one transaction: id = 003********“ ((Validierungsformel „UserProfileSwitchRule“ ungültig) (java.lang.IllegalStateException: Programmierfehler: Sie können keine EntityObjects mit verschiedenen UddInfos innerhalb einer Transaktion mischen: id = 003********)

Schritte zum Reproduzieren:

1. Melden Sie sich bei der Community-URL an, z. B. B.<instance-community-URL><community-name>https:////s
2. Klicken Sie in der oberen rechten Ecke auf die Schaltfläche „Anmelden“.
3. Melden Sie sich mit dem Benutzernamen und dem Kennwort eines autorisierten Benutzers bei der Community an.
4. Der obige Fehler wird erzeugt.

Lösung


Lösung zu Beispiel 1:

Wenn die Aktion in derselben Transaktion ausgeführt wird, fügen Sie die Aktion unter „Geplante Aktion“ hinzu. Diese Positionierung trennt Ihre Aktualisierungs- oder Erstellungsaktion von Ihren sofortigen Aktionen. 

Geplante Aktion ist unter den folgenden Bedingungen verfügbar: 

Die Einstellung für die Evaluierungskriterien lautet:

  • „Erstellt“
  • „Wenn ein Datensatz erstellt oder bearbeitet wird“
Und die Option „Möchten Sie die Aktionen nur ausführen, wenn die angegebenen Änderungen am Datensatz vorgenommen wurden?“ ist unter „Erweitert“ auf der Seite „Kriterien für diese Aktionsgruppe definieren“ aktiviert.

 

Lösung zu Beispiel 2: 

  • Beim Ausführen einer Validierungsregel bei - FormulaTransactionObserver.lazyFetchTargetEntityObject(FormulaTransactionObserver.java:131) -
ist die referenzierte Formel „Contact.Account“.
  • Sie lädt „Contact“ in die gleiche TransactionEntityObjectMap, die „BlueID“ als „Auth Provider uddInfo“ hat.
 

WICHTIG: Diese Implementierung ist NICHT zulässig, wie in der Fehlermeldung mit diesem Format erklärt wird:

„...(java.lang.IllegalStateException: Programmer Error: you cannot mix EntityObjects with different UddInfos within one transaction: id = 003********“ (Programmierfehler: Sie können keine EntityObjects mit verschiedenen UddInfos innerhalb einer Transaktion mischen: id = 003********)

Das ist eine Einschränkung in der bestehenden Funktionalität.
Hinweis: Standard-Authentifizierungsanbieter wie Salesforce oder Facebook sind von dieser Einschränkung nicht betroffen. Diese Anbieter sind wie die benutzerdefinierte Implementierung im beschriebenen Anwendungsfall. Mithilfe einer Umgehung können sie gemischte Objekte aus den Benutzervalidierungsregeln für benutzerdefinierte Authentifizierungsanbieter vermeiden.

Beispiel:

1. Kommentieren Sie die Anweisung aus, die im Auth-Registrierungshandler ausgelöst wird, z. B. // update(u);
2. Ändern Sie die Validierungsregel so, dass Setup- und Nicht-Setup-Einheit-Objekte „nicht“ gemischt werden können, wie in den nachstehenden Verweisen angegeben.

Tipp (optional): Wenn Sie die Validierungsregel deaktivieren, funktioniert es.

 

Verweise:

Nummer des Knowledge-Artikels

000382600

 
Laden
Salesforce Help | Article