SalesforceのMIXED_DML_OPERATIONエラー(設定と非設定オブジェクト)の解決策

設定(Setup)と非設定(non-setup)オブジェクトを1つトランザクションで同時にDML操作をかけると、下記のエラーが発生します。

MIXED_DML_OPERATION, DML operation on setup object is not permitted after you have updated a non-setup object (or vice versa): CustomObject__c, original object: User: []

下記のサンプルコードでこの現象が再現できます。

設定(Setup)オブジェクト

では、そもそもSalesforceの設定(Setup)オブジェクトは何なんでしょうか?
設定オブジェクトというのは、組織のレコードへのユーザのアクセスに影響を与えるものであります。
適切なアクセスレベル権限で操作が実行されるため、こうした種別のsObjectは別のトランザクションに挿入または更新する必要があります。

下記は幾つ例のSetupオブジェクトです:
・ObjectPermissions
・PermissionSet
・PermissionSetAssignment
・QueueSObject
・Territory
・UserTerritory
・UserRole
・User
    fields: UserRoleId, IsActive, ForecastEnabled, IsPortalEnabled, Username, ProfileId

ソリューション

このようなエラーを解消するには、別のトランザクションで実装すればいいです。
例えば@futureメッソドの使用。


Happy Coding!

参照 :
DML 操作で同時に使用できない sObject