2012-04-13 2 views
3

내가 연락처 개체에 대한 트리거를 가지고 개체를 때 나는 다음과 같은 예외가 얻을이 트리거에서 사용자 레코드를 업데이트하려고하면 : 설치에MIXED_DML_OPERATION 오류가 업데이트하는 사용자는

"MIXED_DML_OPERATION, DML 작업을 사용자, 원래 개체 :가 아닌 설치 객체 (또는 그 반대)을 업데이트 한 후 개체가 허용되지 않습니다 "연락

트리거 코드 : 사용자 레코드의를 업데이트하는 동안 나는이 오류를 방지하려면 어떻게

trigger UpdateContactTrigger on Contact (after update) { 

    User u = [SELECT Id, IsActive FROM User WHERE IsActive = true]; 

    u.IsActive = false; 
    update u; 

} 

연락처 trig의 필드 게르?

답변

9

세일즈 포스가 분류 소위 설정 및 비 설정 객체로 객체. 연락처는 설정되지 않은 개체이지만 사용자는 설정 개체입니다. Salesforce는 DML 작업을 제한하여 두 종류의 객체를 동일한 컨텍스트에서 조작 할 수 없도록합니다.

document의 끝 부분과 앞의 대답에서 설명한대로 충돌하는 개체의 DML 코드를 @future 메서드에 배치하면이 문제를 해결할 수있는 임시 해결책이 있습니다.

내 경우에는 다른 @future 메서드를 호출 한 사용자에게 업데이트 트리거가 있고 Salesforce에서 다른 @future 메서드의 @future 메서드를 호출 할 수 없기 때문에 @future 메서드를 사용하지 못했습니다.

그래서 사용자 개체의 경우에 따라 작동하는 다른 해결 방법을 생각해 냈습니다.

API 버전 15.0부터 Salesforce는 실제로 설정되지 않은 개체 업데이트로 동일한 컨텍스트에서 User 개체의 사용자 지정 필드에 대한 업데이트를 허용합니다. 따라서 사용자의 표준 필드를 업데이트해야하는 경우 사용자 개체에 'before update'트리거가있는 사용자 지정 프록시 필드를 사용할 수 있습니다.

당신은, 사용자의이 isActive 필드를 변경하여 사용자에게 사용자 정의 IsActiveProxy 필드를 추가하고 그것을 트리거에 업데이트를 수행해야하는 경우 :

trigger UpdateContactTrigger on Contact (after update) { 

    User u = [SELECT Id, IsActive FROM User WHERE IsActive = true]; 

    u.IsActiveProxy__c = false; 
    update u; 

} 

그런 다음 사용자의 '갱신 전에'트리거를 작성하는 프록시 입력란 값을 표준 입력란에 복사합니다.

trigger BeforeUpdateUserTrigger on User (before update) { 

    for(User user : trigger.new) { 

     if(user.IsActive != user.IsActiveProxy__c) { 
      user.IsActive = user.IsActiveProxy__c; 
     } 

    } 

} 

그게 전부입니다! 그것은 나를 위해 일했습니다.

2

업데이트를 수행 할 @future 메소드를 정의하고이 메소드를 trigger에서 호출해야합니다.

@future 
updateUser(){ 
    User u = [SELECT Id, IsActive FROM User WHERE IsActive = true]; 

    u.IsActive = false; 
    update u; 
} 

및 트리거에 전화 :

trigger UpdateContactTrigger on Contact (after update) { 
    updateUser(); 
}  
+0

예 저는이 방법을 시도했지만 '@future'메서드를 호출하고 다른 '@future'메서드에서 '@future'메서드를 호출하는 트리거가 사용자에게 허용되어 있지 않으므로 저에게 적합하지 않습니다. 영업. 나는이 문제를 해결할 수있는 대안을 찾았고 나중에 대답으로 게시 할 것입니다. 답변 감사합니다! –