2012-04-13 8 views
3

オブジェクトときに私はContactオブジェクトにトリガを持っていると私は、このトリガーでのユーザーレコードを更新しようとすると、私は次の例外を取得:セットアップのMIXED_DML_OPERATIONエラー更新ユーザーが

「MIXED_DML_OPERATION、DML操作をあなたは非設定オブジェクト(またはその逆)を更新した後にオブジェクトが許可されていません:ユーザー、元のオブジェクト:「

トリガ・コード問い合わせ:Userレコードの更新中に、私はこのエラーを回避するにはどうすればよい

trigger UpdateContactTrigger on Contact (after update) { 

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

    u.IsActive = false; 
    update u; 

} 

接触trigからのフィールドゲー?

答えて

9

Salesforceは、いわゆるセットアップと非設定オブジェクトにオブジェクトを分類します。 Contactは非セットアップオブジェクトですが、Userはセットアップオブジェクトです。 Salesforceは、両方の種類のオブジェクトを同じコンテキストで操作できないようにDML操作を制限します。

この問題の回避策は、documentの末尾に記載されているように、@ futureメソッドと競合するオブジェクトのDMLコードと前の回答を配置することです。

私の場合、別の@futureメソッドを呼び出すUpdateトリガーがあり、Salesforceは別の@futureメソッドから@futureメソッドを呼び出すことができないため、@futureメソッドを使用しても機能しませんでした。

私はUserオブジェクトのいくつかのケースで動作する別の回避策を考え出しました。

APIバージョン15.0より、Salesforceは実際には、非設定オブジェクトの更新を使用して同じコンテキストでUserオブジェクトのカスタムフィールドを更新することができます。したがって、ユーザーの標準フィールドを更新する必要がある場合は、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'メソッドを呼び出すトリガがユーザーにあるため、私のためには機能しませんSalesforce。私は問題を解決する別の回避策を見つけました。後で回答として投稿します。返信ありがとう! –