Loading

Erreur « Mixed DML Operation » lorsque vous créez ou mettez à jour des enregistrements via le générateur de processus ou une règle de validation

Date de publication: Mar 3, 2021
Description


Les opérations DML sur certains sObjects, parfois appelées objets de configuration, ne peuvent pas être mélangées avec DML sur d’autres sObjects dans la même transaction. Cette restriction existe car certains sObjects affectent l’accès de l’utilisateur aux enregistrements dans l’organisation. Vous devez insérer ou mettre à jour ces types de sObjects dans une transaction différente pour empêcher les opérations de se produire avec des autorisations de niveau d’accès incorrectes. Par exemple, vous ne pouvez pas mettre à jour un compte et un rôle utilisateur dans une seule transaction.
 

Exemple 1 : 

Si vous utilisez un processus pour tenter de faire deux actions en une seule transaction, une erreur apparaîtra.

Erreur : An error occurred at element myRule_1_A1 (FlowRecordCreate).
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: Utilisateur

Étapes à reproduire :

1. Créez un processus sur l’objet utilisateur
2. Définissez les critères sur Actif | égal à | True
3. Définissez l’action immédiate sur Créer un enregistrement sur l’objet de compte
4. Activez le processus
5. Créez et activez un nouvel utilisateur.
 

Exemple 2 : 

Si vous utilisez une règle de validation pour tenter de mettre à jour l'utilisateur et les objets de contact comme dans les cas d'utilisation suivants :

  • Vous disposez d’un fournisseur d'authentification et un RegistrationHandler pour les connexions des utilisateurs de la communauté.
  • RegistrationHandler.updateUser() mettra à jour l'objet utilisateur.
  • L’utilisateur a une règle de validation avec une formule pointant vers Contact.
  • Dans RegistrationHandler updateUser(), cela met à jour l’objet utilisateur.

Règle de validation :

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 is a formula field in User to get value of "Contact.AccountId"


Lors de la connexion, l’utilisateur obtiendra une erreur :

"... you cannot mix EntityObjects with different UddInfos within one transaction: id = 003********"

ou plus précisément :

"We can’t log you in because of the following error.
ERROR_CREATING_USER: Validation Formula "UserProfileSwitchRule" Invalid (java.lang.IllegalStateException: Programmer Error: you cannot mix EntityObjects with different UddInfos within one transaction: id = 003**********"

Étapes à reproduire :

1. Connectez-vous à l’URL de la communauté, par exemple https://<instance-community-URL>/<community-name>/s
2. Cliquez sur le bouton [Connexion] dans le coin supérieur droit
3. Connectez-vous à la communauté à l’aide des identifiants nom d'utilisateur et mot de passe d'un utilisateur autorisé.
4. L’erreur ci-dessus est générée

Résolution


Solution à l’exemple 1 :

Lorsque l’action exécute la même transaction, ajoutez l’action sous Action planifiée. Cet emplacement sépare votre action de mise à jour ou de création de vos actions immédiates. 

Action planifiée est disponible dans les conditions suivantes : 

Le paramètre Critères d'évaluation est :

  • « Créé »
  • « Lors de la création ou de la modification d'un enregistrement »
Et « Voulez-vous exécuter les actions uniquement lorsque des modifications spécifiées sont apportées à l'enregistrement ? » est activé sous « Avancé » sur la page « Définir des critères pour ce groupe d'actions ».

 

Solution à l’exemple 2 : 

  • Lors de l’exécution d'une règle de validation, à - FormulaTransactionObserver.lazyFetchTargetEntityObject(FormulaTransactionObserver.java:131) -
la formule référencée est « Contact.Account ».
  • Cela charge le contact dans le même TransactionEntityObjectMap qui a le fournisseur d’authentification uddInfo « BlueID ».
 

IMPORTANT : Cette implémentation n’est PAS autorisée, comme expliqué dans le message d’erreur contenant ce format -

"...(java.lang.IllegalStateException: Programmer Error: you cannot mix EntityObjects with different UddInfos within one transaction: id = 003**********"

Il s’agit d’une limitation de la fonctionnalité existante.
Remarque : Les fournisseurs d'authentification standard comme Salesforce ou Facebook ne sont pas affectés par cette limitation. Ces fournisseurs sont comme l’implémentation personnalisée dans le cas d’utilisation décrit. Vous pouvez utiliser une solution de contournement pour éviter les objets mixtes des règles de validation utilisateur pour les fournisseurs d’authentification personnalisés.

Par exemple :

1. Commentez la déclaration qui est lancée dans le gestionnaire d’enregistrement d’authentification, par exemple : // update(u) ;
2. Modifiez la règle de validation pour ne *pas* mélanger les objets d’entité de configuration et de non-configuration tel que spécifié dans les références ci-dessous.

Conseil (facultatif) : La désactivation de la règle de validation la fait fonctionner.

 

Références :

Numéro d’article de la base de connaissances

000382600

 
Chargement
Salesforce Help | Article