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

プロセスビルダーまたは入力規則を使用してレコードを作成または更新したときにエラー「Mixed DML Operation (混合 DML 操作)」が発生する

公開日: Oct 13, 2022
説明


特定の sObject (設定オブジェクトともいう) に対する DML 操作は、同じトランザクション内の他の sObject の DML と混在させることができません。この制限が存在する理由は、sObject には、組織のレコードへのユーザのアクセスに影響を与えるものがあるためです。不適切なアクセスレベル権限で操作が実行されないように、こうした種別の sObject は別のトランザクションで挿入または更新する必要があります。たとえば、1 つのトランザクション内で取引先とユーザロールを更新することはできません。
 

例 1 

プロセスを使用して 1 つのトランザクションで両方を実行しようとするとエラーが表示されます。

エラー: 要素 myRule_1_A1 (FlowRecordCreate) でエラーが発生しました。
INSERT --- INSERT FAILED --- ERRORS : (MIXED_DML_OPERATION) 非設定オブジェクトを更新した後の設定オブジェクト上の DML 操作 (またはその逆) は、許可されていません: Invoice_Statement__c、元のオブジェクト: User

再現手順

1.ユーザオブジェクトでプロセスを作成します。
2.条件を [有効] | [次の文字と一致する] | [True] に設定します。
3.[取引先] オブジェクトの [ルール適用時のアクション] を [レコードを作成] に設定します。
4.プロセスを有効化します。
5.新しいユーザを作成して有効化します。
 

例 2 

次の使用事例のように、入力規則を使用してユーザオブジェクトと取引先責任者オブジェクトを更新しようとする場合

  • コミュニティユーザのログインのための認証プロバイダと RegistrationHandler がある。
  • RegistrationHandler.updateUser() がユーザオブジェクトを更新する。
  • ユーザが取引先責任者を参照する数式を含む入力規則を使用している。
  • RegistrationHandler の updateUser() がユーザオブジェクトを更新する。

入力規則

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 は Contact.AccountId の値を取得するためのユーザ内の数式項目です。


ログインすると次のエラーがユーザに表示されます。

You cannot mix EntityObjects with different UddInfos within one transaction: id = 003******** (1 つのトランザクション内で EntityObjects と異なる UddInfos を混在させることはできません: id = 003********)

またはさらに具体的な次のエラーが表示されます。

次のエラーのため、ログインできません。
ERROR_CREATING_USER: 入力規則数式「UserProfileSwitchRule」が無効 (java.lang.IllegalStateException: Programmer Error: you cannot mix EntityObjects with different UddInfos within one transaction: id = 003********** (java.lang.IllegalStateException: プログラマーエラー: 1 つのトランザクション内で EntityObjects と異なる UddInfos を混在させることはできません: id = 003********)

再現手順

1.コミュニティ URL (例: https://<instance-community-URL>/<community-name>/s) にログインします。
2.右上隅にある [サインイン] ボタンをクリックします。
3.承認済みユーザのログイン情報 (ユーザ名とパスワード) を使用してコミュニティにログインします。
4.上記のエラーが生成されます。

解決策


例 1 の解決策

アクションが同じトランザクション内で実行される場合は、[スケジュール済みアクション] の下にアクションを追加します。この配置によって、更新アクションまたは作成アクションが [ルール適用時のアクション] から分離されます。

スケジュール済みアクションは次の条件で使用できます。 

[評価条件] が次の設定になっている。

  • 作成済み
  • レコードを作成または編集したとき
さらに [このアクショングループの条件を定義] ページの [詳細] で [レコードに指定の変更が行われた場合にのみアクションを実行しますか?] が有効になっている。

 

例 2 の解決策 

  • 入力規則を実行するときに FormulaTransactionObserver.lazyFetchTargetEntityObject(FormulaTransactionObserver.java:131) において、
参照されている数式は Contact.Account です。
  • これによって取引先責任者が同じ TransactionEntityObjectMap に読み込まれます。この TransactionEntityObjectMap には "BlueID" 認証プロバイダ uddInfo が含まれています。
 

重要: この数式を含むエラーメッセージで説明されているように、この実装は許可されません。

「...(java.lang.IllegalStateException: Programmer Error: You cannot mix EntityObjects with different UddInfos within one transaction: id = 003******** (...(java.lang.IllegalStateException: プログラマーエラー: 1 つのトランザクション内で EntityObjects と異なる UddInfos を混在させることはできません: id = 003********)」

これは既存の機能の制限です。
注意: Salesforce や Facebook などの標準認証プロバイダはこの制限の影響を受けません。これらのプロバイダは説明された使用事例でのカスタム実装のようなものです。回避策を使用して、カスタム認証プロバイダ用のユーザの入力規則によってオブジェクトが混在することを避けることができます。

例:

1.認証登録ハンドラで実行されるステートメントをコメントアウトします (例: // update(u);)。
2.下の参照資料で指定されているように、設定エンティティオブジェクトと非設定エンティティオブジェクトを混在させないように入力規則を変更します。

ヒント (省略可能): 入力規則を無効にするとうまく機能します。

 

参照資料

ナレッジ記事番号

000382600

 
読み込み中
Salesforce Help | Article