dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

[salesforce]MIXED_DML_OPERATIONエラーにでてくる設定オブジェクトと非設定オブジェクトとは?

またしてもSalesforceネタ。
テストメソッドを書いていると、以下のようなエラーに遭遇することがあります。

MIXED_DML_OPERATION, 非設定オブジェクトを更新した後の設定オブジェクト上のDML操作(またはその逆)は、許可されていません

たしかに、1トランザクションでUserRoleとEventをinsertしようとした時などに
発生しますね。
これについての対処方法はすでに他サイトでも取り上げられているようで
http://www30304u.sakura.ne.jp/blog/?p=1098
System.runAsなどを使用して、別トランザクションとして扱えば良さそうですね。

ただ、ここでわからないのが
どれが「設定オブジェクト」でどれが「非設定オブジェクト」なのか
ということ。

というわけで調べてみました。


こちらのサイト
Salesforce Developers
によると、

- FieldPermissions
- Group
    You can only insert and update a group in a transaction with other sObjects. Other DML operations are not allowed.
- GroupMember
    You can only insert and update a group member in a transaction with other sObjects in Apex - code saved using Salesforce.com API version 14.0 and earlier.
- ObjectPermissions
- PermissionSet
- PermissionSetAssignment
- QueueSObject
- SetupEntityAccess
- User
    You can insert a user in a transaction with other sObjects in Apex code saved using Salesforce.com API version 14.0 and earlier.
    You can insert a user in a transaction with other sObjects in Apex code saved using Salesforce.com API version 15.0 and later if UserRoleId is specified as null.
    You can update a user in a transaction with other sObjects in Apex code saved using Salesforce.com API version 14.0 and earlier
    You can update a user in a transaction with other sObjects in Apex code saved using Salesforce.com API version 15.0 and later if the following fields are not also updated:
    ・UserRoleId
    ・IsActive
    ・ForecastEnabled
    ・IsPortalEnabled
    ・Username
    ・ProfileId
- UserRole
- UserTerritory
- Territory
- Custom settings in Apex code saved using Salesforce.com API version 17.0 and earlier.

うーんと、このブログ執筆時のAPIバージョンって20は超えてるので
私の場合、よく使うもので気をつけないといけないのは

  • UserRole
  • Group(ただしinsert/updateは可)
  • GroupMember(同上)

あたりかな。