Newer Version Available
DML 操作で同時に使用できない sObject
特定の sObject に対する DML 操作は、同じトランザクション内の他の sObject と混在させることができません。sObject には、組織のレコードへのユーザのアクセスに影響を与えるものがあるためです。こうした種別の sObject は、不正なアクセスレベル権限で操作が実行されないように、別のトランザクションで挿入または更新する必要があります。たとえば、1 つのトランザクション内で取引先とユーザロールを更新することはできません。ただし、delete DML 操作の制限はありません。
- FieldPermissions
- Group
他の sObject を含む 1 つのトランザクションでは、グループの挿入と更新のみを行うことができます。その他の DML 操作は使用できません。
- GroupMember
Salesforce API バージョン 14.0 以前を使用して保存された Apex コードの場合、他の sObject を含む 1 つのトランザクションで、グループメンバーの挿入と更新のみを行うことができます。
- ObjectPermissions
- PermissionSet
- PermissionSetAssignment
- QueueSObject
- ObjectTerritory2AssignmentRule
- ObjectTerritory2AssignmentRuleItem
- RuleTerritory2Association
- SetupEntityAccess
- Territory2
- Territory2Model
- UserTerritory2Association
- User
Salesforce API バージョン 14.0 以前を使用して保存された Apex コードの場合、他の sObject を含む 1 つのトランザクションで、ユーザの挿入を行うことができます。
Salesforce API バージョン 15.0 以降を使用して保存された Apex コードの場合、UserRoleId が null に指定されていれば、他の sObject を含む 1 つのトランザクションで、ユーザの挿入を行うことができます。
Salesforce API バージョン 14.0 以前を使用して保存された Apex コードの場合、他の sObject を含む 1 つのトランザクションで、ユーザの更新を行うことができます。
Salesforce API バージョン 15.0 以降を使用して保存された Apex コードの場合、次の項目も更新されていなければ、他の sObject を含む 1 つのトランザクションで、ユーザの更新を行うことができます。- UserRoleId
- IsActive
- ForecastEnabled
- IsPortalEnabled
- Username
- ProfileId
- UserRole
- UserTerritory
- Territory
- Salesforce API バージョン 17.0 以前を使用して保存された Apex コードのカスタム設定。
カスタムコントローラで Visualforce ページを使用している場合、1 つの要求またはアクション内で sObject 型とこれらの特殊な sObject を混在させることはできません。ただし、後続の要求でこれらの異なる sObject 型の DML 操作を実行できます。たとえば、[保存] ボタンで取引先を作成してから、[送信] ボタンで null 以外のロールのユーザを作成できます。
- 1 つのデータ型の sObject で DML 操作を行うメソッドを作成します。
- 2 番目の sObject データ型を操作するために future アノテーションを使用する 2 番目のメソッドを作成します。
このプロセスは、次のセクションの例で説明します。
例: future メソッドを使用した混合 DML 操作の実行
この例では、future メソッドを使用して User オブジェクトに対する DML 操作を実行することで、混合 DML 操作を実行する方法を示します。
1swfobject.registerObject("clippy.mixedDMLExample1_1", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class MixedDMLFuture {
18 public static void useFutureMethod() {
19 // First DML operation
20 Account a = new Account(Name='Acme');
21 insert a;
22
23 // This next operation (insert a user with a role)
24 // can't be mixed with the previous insert unless
25 // it is within a future method.
26 // Call future method to insert a user with a role.
27 Util.insertUserWithRole(
28 'mruiz@awcomputing.com', 'mruiz',
29 'mruiz@awcomputing.com', 'Ruiz');
30 }
31}1swfobject.registerObject("clippy.MixedDMLExample1_2", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class Util {
18 @future
19 public static void insertUserWithRole(
20 String uname, String al, String em, String lname) {
21
22 Profile p = [SELECT Id FROM Profile WHERE Name='Standard User'];
23 UserRole r = [SELECT Id FROM UserRole WHERE Name='COO'];
24 // Create new user with a non-null user role ID
25 User u = new User(alias = al, email=em,
26 emailencodingkey='UTF-8', lastname=lname,
27 languagelocalekey='en_US',
28 localesidkey='en_US', profileid = p.Id, userroleid = r.Id,
29 timezonesidkey='America/Los_Angeles',
30 username=uname);
31 insert u;
32 }
33}