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;
}
}
}
それでおしまい!それは私のために働いた。