33

Salesforceテストでは、特定のタイプのユーザーとしてテストの一部を実行するためにUserオブジェクトを作成する必要がある場合があります。

ただし、Salesforce Summer 08の更新以降、同じテストでユーザーオブジェクトと通常のオブジェクト(アカウントなど)の両方を作成しようとすると、次のエラーが発生します。

MIXED_DML_OPERATION、非セットアップオブジェクトを更新した後(またはその逆)、セットアップオブジェクトでのDML操作は許可されません:ユーザー、元のオブジェクト:アカウント

エラーは、Eclipse / Force.com IDEからテストを実行する場合には発生しませんが、Salesforceにデプロイしてから、Salesforce内からテストを実行する場合に発生することに注意してください。

このエラーを回避するためにテストを書き直すにはどうすればよいですか?

エラーの原因となるテストの簡単な例を次に示します。

static testMethod void test_mixed_dmlbug() {        
    Profile p = [select id from profile where name='(some profile)'];
    UserRole r = [Select id from userrole where name='(some role)'];
    User u = new User(alias = 'standt', email='standarduser@testorg.com', 
            emailencodingkey='UTF-8', lastname='Testing', 
            languagelocalekey='en_US', 
            localesidkey='en_US', profileid = p.Id, userroleid = r.Id,
            timezonesidkey='America/Los_Angeles', 
            username='standarduser@testorg.com');
    Account a = new Account(Firstname='Terry', Lastname='Testperson');
    insert a;

    System.runAs(u) {
        a.PersonEmail = 'test@madeupaddress.com';
        update a;
    }

}
4

5 に答える 5

42

ここにはまだSalesforceの人はあまりいないと思います。

私は解決策を見つけました、なぜそれが機能するのか分かりませんが、それは機能します。

通常のオブジェクトにアクセスするテストのすべての部分は、次のように、現在のユーザーを明示的に使用するSystem.runAsでラップする必要があります。

User thisUser = [ select Id from User where Id = :UserInfo.getUserId() ];
System.runAs ( thisUser ) {
    // put test setup code in here
}

したがって、質問で指定されたtext_mixed_dmlbugメソッドの例は次のようになります。

static testMethod void test_mixed_dmlbug() {  
    User u;
    Account a;      
    User thisUser = [ select Id from User where Id = :UserInfo.getUserId() ];
    System.runAs ( thisUser ) {
        Profile p = [select id from profile where name='(some profile)'];
        UserRole r = [Select id from userrole where name='(some role)'];
        u = new User(alias = 'standt', email='standarduser@testorg.com', 
            emailencodingkey='UTF-8', lastname='Testing', 
            languagelocalekey='en_US', 
            localesidkey='en_US', profileid = p.Id, userroleid = r.Id,
            timezonesidkey='America/Los_Angeles', 
            username='standarduser@testorg.com');
        a = new Account(Firstname='Terry', Lastname='Testperson');
        insert a;
    }
    System.runAs(u) {
        a.PersonEmail = 'test@madeupaddress.com';
        update a;
    }

}

その後、MIXED_DML_OPERATIONエラーの発生が停止します。

于 2010-03-09T16:47:01.380 に答える
13

回避策を見つけたようです。このエラーが発生する理由を明らかにしたかっただけです。

この問題が発生していると思います(http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_dml_non_mix_sobjects.htmによる):

DML操作で一緒に使用できないsObject

一部のsObjectでは、トランザクションごとに1つのタイプに対してのみDML操作を実行する必要があります。たとえば、アカウントを挿入してから、ユーザーまたはグループメンバーを1つのトランザクションに挿入することはできません。次のsObjectをトランザクションで一緒に使用することはできません。

* Group1
* GroupMember
* QueueSObject
* User2
* UserRole
* UserTerritory
* Territory

重要これに対する主な例外は、テストでrunAsメソッドを使用している場合です。

さらに、Summer 08リリースノート(そのリンクはPDFです)には次のように書かれています。

以前のリリースでは、トリガーを含む単一のトランザクションで、複数のタイプのsObjectに対してDML操作を実行できました。たとえば、アカウントを挿入してからユーザーを挿入できました。Summer '08の時点では、次のsObjectのリストから1つのタイプのsObjectに対してのみDML操作を実行できます。

たとえば、アカウントを挿入してからユーザーを挿入したり、グループを更新してからグループメンバーを挿入したりすることはできません。

  • グループ
  • グループメンバー
  • QueueSObject
  • ユーザー
  • UserRole
  • UserTerritory
  • 地域

さらに、UserとTerritoryがDMLの挿入と更新の操作をサポートするようになり、UserRoleがDMLの挿入、更新、削除、アップサートの操作をサポートするようになりました。

Apex DML操作は、次のsObjectではサポートされていません。

  • AccountTerritoryAssignmentRule
  • AccountTerritoryAssignmentRuleItem
  • UserAccountTeamMember
于 2010-03-10T01:16:45.343 に答える
7

この動作は、実際にはセールスフォースのドキュメントに記載されています:http: //www.salesforce.com/us/developer/docs/apexcode/index_Left.htm#StartTopic=Content/apex_dml_non_mix_sobjects.htm? SearchType 。「重要これに対する主な例外は、テストでrunAsメソッドを使用している場合です」と書かれている箇所を読んでください。

于 2011-07-05T21:44:57.090 に答える
1

ドキュメントでこれを見つけました:

その他の用途runAs

このメソッドを使用して、DML操作をブロックrunAs内に含めることにより、テストで混合DML操作を実行することもできます。runAsこのようにして、セットアップオブジェクトを他のオブジェクトと一緒に挿入または更新するときに返される混合DMLエラーをバイパスしますsObjectssObjectsDML操作で一緒に使用できないことを参照してください。

したがって、回避策は回避策ではないように見えますがRunAs、Salesforceは、混合DMLの問題を回避する唯一の方法として想定しています。

お役に立てれば

参照

于 2018-03-05T13:54:01.407 に答える
0

このエラーは、apexの単一のトランザクションでユーザーおよびその他のオブジェクトのレコードを作成しようとしたときによく発生します。

apexクラス/トリガーの回避策:エラーが発生したときにユーザーを作成するためにfutureメソッドを使用する

テストクラスでの回避策:新しいユーザーデータを作成しようとせず、代わりに))>を使用してください

コードスニペット-https ://thesalesforcedev.blogspot.com/2019/07/mixeddmloperation-dml-operation-on.html

于 2019-07-25T15:11:58.450 に答える