4

Contact オブジェクトにトリガーがあり、このトリガーでユーザー レコードを更新しようとすると、次の例外が発生します。

「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;

}

連絡先トリガーからユーザー レコードのフィールドを更新する際に、このエラーを回避するにはどうすればよいですか?

4

2 に答える 2

10

Salesforce は、オブジェクトをいわゆる設定オブジェクトと非設定オブジェクトに分類します。ユーザーはセットアップ オブジェクトですが、連絡先は非セットアップ オブジェクトです。Salesforce は DML 操作を制限しているため、両方の種類のオブジェクトを同じコンテキストで操作することはできません。

このドキュメントの最後と前の回答で説明されているように、競合するオブジェクトの DML コードを @future メソッドに配置することで、この問題を回避できます。

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

そこで、ユーザー オブジェクトのいくつかのケースで機能する別の回避策を思いつきました。

API バージョン 15.0 以降、Salesforce は実際には、設定されていないオブジェクトの更新と同じコンテキストでユーザー オブジェクトのカスタム フィールドの更新を許可します。したがって、ユーザーの標準フィールドを更新する必要がある場合は、ユーザー オブジェクトで「更新前」トリガーを使用してカスタム プロキシ フィールドを使用できます。

ユーザーの 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;
        }

    }

}

それでおしまい!それは私のために働いた。

于 2012-04-13T15:03:20.283 に答える