为什么我在 Salesforce 更新触发器中收到 DML 错误?

Why am i getting DML error in Salesforce update trigger?

我正在尝试通过来自 csv 的批量 API 更新 Salesforce 中的 BilingCountry,csv 文件中有 1025 个条目。 csv 中的帐户 ID 的 BillingCountry 与 Salesforce 中的不同,但我收到以下错误:

CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY:test_tr_U: System.LimitException: Too many DML rows: 10001:--

这是我的触发器:

   Trigger test_tr_U on Account (after update)
   {
    if(checkRecursion.runOnce())
    {
        set<ID> ids = Trigger.newMap.keyset();
        List<TestCust__c> list1 = new List<TestCust__c>();
        for(ID id : ids)
        {
            for (Account c: Trigger.new)
            {
                Account oldObject = Trigger.oldMap.get(c.ID);
                if (c.Billing_Country__c!= oldObject.Billing_Country__c || 
                  c.BillingCountry!= oldObject.BillingCountry )
                {
                    TestCust__c change = new TestCust__c();
                    change.Field1__c = 'update'; 
                    change.Field2__c = id; 
                    change.Field3__c = false; 
                    change.Field4__c = 'TESTCHANGE'; 
                    list1.add(change);
                }
            }
        }
        Database.DMLOptions dmo = new Database.DMLOptions();
        dmo.assignmentRuleHeader.useDefaultRule = true;
        Database.insert(list1, dmo);
    }
  }

遍历每个 id,然后遍历每个更新的帐户将导致创建#id * #account。这些值相同,因此您将创建#account^2 (1050625) TestCust__c 条记录。
Salesforce 将 1025 条记录拆分为 200 条记录的块,因为批量 API 请求导致触发器针对同一 HTTP 请求触发多个调控器 limits are reset between these trigger invocations
无论如何,对于每个触发器 运行,您正在创建 200*200 = 40000 TestCust__c 条记录,这大大高于每笔交易的 limit of 10000 records,因此系统将提高 LimitException

你应该删除外循环:这是完全错误的。

Trigger test_tr_U on Account (after update)
{
    if(checkRecursion.runOnce())
    {
        List<TestCust__c> list1 = new List<TestCust__c>();
        for (Account c: Trigger.new)
        {
            Account oldObject = Trigger.oldMap.get(c.Id);
            if (c.Billing_Country__c != oldObject.Billing_Country__c || 
                c.BillingCountry!= oldObject.BillingCountry)
            {
                TestCust__c change = new TestCust__c();
                change.Field1__c = 'update'; 
                change.Field2__c = c.Id; 
                change.Field3__c = false; 
                change.Field4__c = 'TESTCHANGE'; 
                list1.add(change);
            }
        }
        Database.DMLOptions dmo = new Database.DMLOptions();
        dmo.assignmentRuleHeader.useDefaultRule = true;
        Database.insert(list1, dmo);
    }
}