1

我正在尝试编写一个“更新后”触发器,对刚刚更新的记录的所有子记录进行批量更新。这需要能够一次处理 15k+ 子记录。不幸的是,限制似乎是 100,远远低于我的需求,甚至无法接受。我没有尝试将记录分成每批 100 条,因为这仍然会使我每次触发器执行的更新上限为 10k。(也许我可以把触发器菊花链在一起?呃。)

有谁知道我可以跳过哪些系列的箍来克服这个限制?

编辑:我尝试在触发器中调用以下@future 函数,但它从不更新子记录:

global class ParentChildBulkUpdater
{
    @future 
    public static void UpdateChildDistributors(String parentId) {
        Account[] children = [SELECT Id FROM Account WHERE ParentId = :parentId];

        for(Account child : children)
            child.Site = 'Bulk Updater Fired';
        update children;

    }
}
4

6 回答 6

4

解决此问题的最佳(也是最简单)的方法是使用Batch Apex,您可以创建一个批处理类并从触发器中触发它。与@future 一样,它在单独的线程中运行,但最多可以处理 50,000,000 条记录!

在使用之前,您需要将一些信息传递给您的批处理类,database.executeBatch以便它具有要使用的父 ID 列表,或者您当然可以获取所有帐户;)

我只是注意到这个问题有多老,但希望这个答案对其他人有帮助。

于 2011-05-04T23:55:24.013 回答
2

比这更糟糕的是,您甚至无法首先获得这 15k 条记录,因为触发器中有 1,000 行查询限制(这取决于调用触发器的行数,但这可能无济于事)

我想你唯一的方法是使用@future 标签 - 在文档中阅读。它为您提供了更高的限制。虽然,你一天只能调用这么多——所以你可能需要以某种方式跟踪哪些父对象的子对象更新,然后离线处理。

最后的选择可能是通过一些外部工具使用 API。但是您仍然必须确保代码中的所有内容都是批处理的。

起初我认为这些限制是严厉的,但实际上,如果你正确地批处理事情,你可以在其中做很多事情,我们会定期从触发器更新 1000 行。从架构的角度来看,不仅如此,而且您实际上是在谈论通常不会由触发器激活的批处理。可以肯定的一件事 - 他们让你跳过篮球来做到这一点。

于 2010-04-09T08:26:51.753 回答
1

@future 不起作用(根本不更新记录)?诡异的。您是否尝试在自动化测试中使用您的功能?它应该可以工作并且注释应该被忽略(在测试期间它将立即执行,测试方法有更高的限制)。我建议您对此进行更多调查,这似乎是您想要完成的最佳解决方案。

另外-也许尝试从您的班级而不是触发器中调用它?

菊花链触发器将不起作用,我过去曾尝试过。

您的最后一个选项可能是批量 Apex(来自 Winter'10 版本,因此所有组织现在都应该拥有它)。它适用于大量数据更新/验证作业,通常在普通数据库中运行一夜之间(可以安排)。请参阅http://www.salesforce.com/community/winter10/custom-cloud/program-cloud-logic/batch-code.jsp和发行说明 PDF。

于 2010-04-11T07:03:41.110 回答
1

我认为 Codek 是对的,走 API / 外部工具路线是一个不错的方法。州长限制仍然适用,但对 API 调用的严格程度要低得多。Salesforce 最近改进了他们的 DataLoader 工具,所以这可能是值得研究的。

您可以尝试的另一件事是使用带有出站消息的工作流规则来调用您端的 Web 服务。只需发送父对象,让您端的进程通过 API 处理子记录更新。出站消息需要注意的一件事是,最好以某种方式将进程排队,并立即响应 Salesforce。否则 Salesforce 将重新发送消息。

于 2010-04-09T16:10:19.277 回答
0

我相信在 API 的第 18 版中,1000 的限制已被删除。(所以文件说,但在某些情况下我仍然达到了限制)

因此,您也许可以使用批处理顶点。使用单个 APEX 更新语句

就像是:

列出孩子 = 新列表{};

for(childObect__c c : [SELECT ....]) {

c.foo__c = '酒吧';

children.add(c);

} 更新(儿童);;

确保你扩大你的跳跳虎也看到http://sfdc.arrowpointe.com/2008/09/13/bulkifying-a-trigger-an-example/

于 2010-04-10T07:58:20.377 回答
0

也许在这里更改您的数据模型是更好的选择。考虑在子对象上创建一个公式,您可以在其中访问父对象的数据。这可能会更有效率。

于 2011-02-13T12:30:14.623 回答