Loading

프로세스 빌더 또는 검증 규칙을 통해 레코드를 생성하거나 업데이트할 때 '혼합 DML 작업' 오류 발생

게시 일자: Oct 13, 2022
상세 설명


설정 개체라고도 하는 특정 sObject에 대한 DML 작업을 동일한 트랜잭션의 다른 sObject에 대한 DML과 혼합할 수 없습니다. 이러한 제한이 존재하는 것은 일부 sObject가 조직의 레코드에 대한 사용자 액세스 권한에 영향을 미치기 때문입니다. 잘못된 액세스 수준 권한을 통해 작업이 발생하지 않게 하려면 이러한 유형의 sObject를 다른 트랜잭션에 삽입하거나 업데이트해야 합니다.  예를 들어 단일 트랜잭션에서 계정과 사용자 역할을 업데이트하면 안 됩니다.
 

예 1 

프로세스를 사용하여 단일 트랜잭션에서 두 가지 작업을 모두 수행하려고 하면 오류가 발생합니다.

오류: 요소 myRule_1_A1에서 오류가 발생했습니다(FlowRecordCreate).
INSERT --- INSERT FAILED --- ERRORS : (MIXED_DML_OPERATION) 비설정 개체를 업데이트한 후에는 설정 개체에 대한 DML 작업을 수행할 수 없으며 그 반대도 마찬가지입니다: Invoice_Statement__c, original object: User

재현 과정:

1. 사용자 개체에 프로세스를 만듭니다
2. 기준을 Active | equals | True(활성 | 같음 | 참)로 설정합니다
3. 계정 개체에서 Immediate Action(즉시 수행할 작업)을 Create Record(레코드 만들기)로 설정합니다
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 is a formula field in User to get value of "Contact.AccountId"


로그인할 때 사용자에게 다음 오류가 발생합니다.

"... 하나의 트랜잭션 내에서 서로 다른 UddInfos를 가진 EntityObjects를 혼합할 수 없습니다: id = 003********"

혹은 아래와 같이 더욱 구체적인 오류가 발생합니다.

"다음 오류로 인해 로그인할 수 없습니다.
ERROR_CREATING_USER: Validation Formula "UserProfileSwitchRule" Invalid (java.lang.IllegalStateException: 프로그래머 오류: 하나의 트랜잭션 내에서 서로 다른 UddInfos를 가진 EntityObjects를 혼합할 수 없습니다: id = 003********"

재현 과정:

1. 커뮤니티 URL(예: https://<instance-community-URL>/<community-name>/s)로 로그인합니다
2. 오른쪽 상단 모서리의 [Sign In(로그인)] 버튼을 클릭합니다
3. 인증된 사용자의 사용자 이름과 비밀번호 자격 증명을 사용해서 커뮤니티에 로그인합니다.
4. 위의 오류가 발생합니다

솔루션


예 1의 솔루션:

동일한 트랜잭션에서 작업이 실행되면 예약된 작업 아래에 작업을 추가합니다. 이를 통해 업데이트 또는 생성 작업을 즉시 수행할 작업과 분리할 수 있습니다. 

예약된 작업은 아래의 조건이 충족될 때 사용할 수 있습니다. 

평가 기준 설정:

  • 'Created(생성됨)'
  • 'A record is created or updated(레코드가 생성 또는 업데이트됨)'
그리고 'Do you want to execute the actions only when specified changed are made to the record?(레코드에 지정된 변경 사항이 발생한 경우에만 작업을 실행하시겠습니까?)'가 'Define Criteria for this Action Group(이 작업 그룹에 대한 기준 정의)' 페이지의 'Advanced(고급)'에서 활성화됩니다.

 

예 2의 솔루션: 

  • FormulaTransactionObserver.lazyFetchTargetEntityObject(FormulaTransactionObserver.java:131)에서 검증 규칙을 실행할 때
참조하는 수식이 "Contact.Account"입니다.
  • 이는 "BlueID" 인증 프로바이더 uddInfo가 있는 동일한 TransactionEntityObjectMap에 연락처를 로드합니다.
 

중요: 이 형식을 포함하는 오류 메시지에 설명된 것처럼 이 구현은 허용되지 않습니다.

"...(java.lang.IllegalStateException: 프로그래머 오류: 하나의 트랜잭션 내에서 서로 다른 UddInfos를 가진 EntityObjects를 혼합할 수 없습니다: id = 003********"

이는 기존 기능의 제한 사항입니다.
참고:  Salesforce 및 Facebook과 같은 표준 인증 프로바이더는 이 제한에 영향을 받지 않습니다. 이러한 프로바이더는 설명된 사용 사례들에서 사용자 정의 구현과 유사합니다. 사용자 정의 인증 프로바이더에 대한 사용자 검증 규칙에서 개체 혼합을 방지할 수 있는 방법이 있습니다.

예:

1. 인증 등록 핸들러에서 발생한 명령문을 주석 처리합니다. 예: // update(u);
2. 아래의 참조에 지정된 것처럼 설정 엔티티 개체와 비설정 엔티티 개체가 혼합되지 *않도록* 검증 규칙을 수정합니다.

팁(선택 사항):  검증 규칙을 비활성화하면 작동합니다.

 

참조:

Knowledge 기사 번호

000382600

 
로드 중
Salesforce Help | Article