Salesforce:System.LimitException:太多SOQL查询:101

Salesforce:System.LimitException:太多SOQL查询:101,salesforce,force.com,soql,Salesforce,Force.com,Soql,几天前一切正常,除了配置文件之外,没有对系统进行任何新的更改 突然我得到了这个错误信息: 错误:无效数据。 查看下面的所有错误消息以更正数据。 Apex触发器generateUniqueBidId导致意外异常,请与管理员联系:generateUniqueBidId:System.LimitException:太多SOQL查询:101 循环中有一个SOQL for (Bids__c bid : recentBids){ String recentProfileName = [SELECT

几天前一切正常,除了配置文件之外,没有对系统进行任何新的更改

突然我得到了这个错误信息:

错误:无效数据。 查看下面的所有错误消息以更正数据。 Apex触发器generateUniqueBidId导致意外异常,请与管理员联系:generateUniqueBidId:System.LimitException:太多SOQL查询:101


循环中有一个SOQL

for (Bids__c bid : recentBids){
    String recentProfileName = [SELECT Profile.Name FROM User Where Id = :bid.CreatedById LIMIT 1].Profile.Name;
    String bidId = profilePrefixMap.get(recentProfileName);
    bid.Bid_unique_label__c =  ((bidId == null) ? defaultPrefix : bidId);           
}
upsert recentBids;
List<Bids__c> recentBids = [SELECT Id, CreatedBy.Profile.Name, Bid_unique_label__c 
FROM Bids__c 
WHERE Bid_unique_label__c = NULL];

for (Bids__c bid : recentBids){
    String recentProfileName = bid.CreatedBy.Profile.Name;
    String bidId = profilePrefixMap.get(recentProfileName);
    bid.Bid_unique_label__c =  ((bidId == null) ? defaultPrefix : bidId);           
}
upsert recentBids;
这是一个性能杀手,事实上,我很惊讶限制是100个查询,过去在触发器上下文中不超过20个查询。解决问题的一个快速方法是使用带有点符号的关系查询。这将消除在循环中进行查询的需要

for (Bids__c bid : recentBids){
    String recentProfileName = [SELECT Profile.Name FROM User Where Id = :bid.CreatedById LIMIT 1].Profile.Name;
    String bidId = profilePrefixMap.get(recentProfileName);
    bid.Bid_unique_label__c =  ((bidId == null) ? defaultPrefix : bidId);           
}
upsert recentBids;
List<Bids__c> recentBids = [SELECT Id, CreatedBy.Profile.Name, Bid_unique_label__c 
FROM Bids__c 
WHERE Bid_unique_label__c = NULL];

for (Bids__c bid : recentBids){
    String recentProfileName = bid.CreatedBy.Profile.Name;
    String bidId = profilePrefixMap.get(recentProfileName);
    bid.Bid_unique_label__c =  ((bidId == null) ? defaultPrefix : bidId);           
}
upsert recentBids;
这段代码仍然有一些问题

在单个事务中插入/更新的行数可能不超过10K行,您至少应该添加limit子句。 您将触发器上下文中的数据工作与一些无关内容的数据修复混合在一起。你不应该背负,因为用户不会理解为什么他们看到错误来自他们没有接触的数据。 更不用说上次修改的在您的系统中现在毫无价值了。

如果是一次清理不良数据的活动,请修复一个独特的标签——考虑运行一个数据修复程序并删除该代码。如果这真的是一个反复出现的情况-编写一个批处理作业


或者研究是否可以编写一个工作流规则来生成唯一的密钥,看起来这是可行的,并且比编写解决方案要好。

这就解决了目前的错误消息。我现在将继续使用代码。