为什么我在 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);
}
}
我正在尝试通过来自 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);
}
}