この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Newer Version Available

This content describes an older version of this product. View Latest

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

特定の sObject に対する DML 操作は、同じトランザクション内の他の sObject と混在させることができません。sObject には、組織のレコードへのユーザのアクセスに影響を与えるものがあるためです。こうした種別の sObject は、不正なアクセスレベル権限で操作が実行されないように、別のトランザクションで挿入または更新する必要があります。たとえば、1 つのトランザクション内で取引先とユーザロールを更新することはできません。ただし、delete DML 操作の制限はありません。

DML 操作を実行するとき、同じトランザクション内で次の sObject を他の sObject と一緒に使用することはできません。
  • FieldPermissions
  • Group

    他の sObject を含む 1 つのトランザクションでは、グループの挿入と更新のみを行うことができます。その他の DML 操作は使用できません。

  • GroupMember

    Salesforce.com API バージョン 14.0 以前を使用して保存された Apex コードの場合、他の sObject を含む 1 つのトランザクションでは、グループメンバーの挿入と更新のみを行うことができます。

  • ObjectPermissions
  • PermissionSet
  • PermissionSetAssignment
  • QueueSObject
  • ObjectTerritory2AssignmentRule
  • ObjectTerritory2AssignmentRuleItem
  • RuleTerritory2Association
  • SetupEntityAccess
  • Territory2
  • Territory2Model
  • UserTerritory2Association
  • User

    Salesforce.com API バージョン 14.0 以前を使用して保存された Apex コードの場合、他の sObject を含む 1 つのトランザクションでは、ユーザの挿入を行うことができます。

    Salesforce.com API バージョン 15.0 以降を使用して保存された Apex コードの場合、UserRoleId が null に指定されていれば、他の sObject を含む 1 つのトランザクションでは、ユーザの挿入を行うことができます。

    Salesforce.com API バージョン 14.0 以前を使用して保存された Apex コードの場合、他の sObject を含む 1 つのトランザクションでは、ユーザの更新を行うことができます。

    Salesforce.com API バージョン 15.0 以降を使用して保存された Apex コードの場合、次の項目も更新されていなければ、他の sObject を含む 1 つのトランザクションで、ユーザの更新を行うことができます。
    • UserRoleId
    • IsActive
    • ForecastEnabled
    • IsPortalEnabled
    • Username
    • ProfileId
  • UserRole
  • UserTerritory
  • Territory
  • Salesforce.com API バージョン 17.0 以前を使用して保存された Apex コードのカスタム設定。

カスタムコントローラで Visualforce ページを使用している場合、1 つの要求またはアクションでは、DML 操作は 1 つのみのデータ型の Object に対して行うことができます。ただし、後続要求では、異なるデータ型の sObject で DML 操作を実行できます。たとえば、保存ボタンで取引先を作成した後に、送信ボタンでユーザを作成できます。

次のプロセスを使用して、1 つのクラスで複数のデータ型の sObject に対して DML 操作を実行できます。
  1. 1 つのデータ型の sObject で DML 操作を行うメソッドを作成します。
  2. 2 番目の sObject データ型を操作するために future アノテーションを使用する 2 番目のメソッドを作成します。

このプロセスは、次のセクションの例で説明します。

例: future メソッドを使用した混合 DML 操作の実行

この例では、future メソッドを使用して User オブジェクトに対する DML 操作を実行することで、混合 DML 操作を実行する方法を示します。

1swfobject.registerObject("clippy.mixedDMLExample1_1", "9");public class MixedDMLFuture {
2    public static void useFutureMethod() {
3        // First DML operation
4        Account a = new Account(Name='Acme');
5        insert a;
6        
7        // This next operation (insert a user with a role) 
8        // can't be mixed with the previous insert unless 
9        // it is within a future method. 
10        // Call future method to insert a user with a role.
11        Util.insertUserWithRole(
12            'mruiz@awcomputing.com', 'mruiz', 
13            'mruiz@awcomputing.com', 'Ruiz');        
14    }
15}
1swfobject.registerObject("clippy.MixedDMLExample1_2", "9");public class Util {
2    @future
3    public static void insertUserWithRole(
4        String uname, String al, String em, String lname) {
5
6        Profile p = [SELECT Id FROM Profile WHERE Name='Standard User'];
7        UserRole r = [SELECT Id FROM UserRole WHERE Name='COO'];
8        // Create new user with a non-null user role ID 
9        User u = new User(alias = al, email=em, 
10            emailencodingkey='UTF-8', lastname=lname, 
11            languagelocalekey='en_US', 
12            localesidkey='en_US', profileid = p.Id, userroleid = r.Id,
13            timezonesidkey='America/Los_Angeles', 
14            username=uname);
15        insert u;
16    }
17}