代码之家  ›  专栏  ›  技术社区  ›  Jake

通过Salesforce触发器管理器

  •  0
  • Jake  · 技术社区  · 15 年前

    我试图编写一个“after update”触发器,对刚刚更新的记录的所有子记录执行批更新。这需要能够一次处理15K+子记录。不幸的是,限制似乎是100,这是远远低于我的需要,甚至不接近可以接受。我还没有试过将记录分成每批100个,因为这仍然会使我的每次触发器执行的更新上限为10K。(也许我可以把触发器串在一起?嗯!

    有没有人知道我可以跳过哪一系列的环来克服这个限制?

    编辑:我试图在触发器中调用following@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;
    
        }
    }
    
    6 回复  |  直到 14 年前
        1
  •  2
  •   Codek    15 年前

    最糟糕的是,您甚至无法在第一时间获得这些15K记录,因为触发器中有1000行的查询限制(这与触发器被调用的行数有关,但这可能没有帮助)

    我想你唯一的办法就是在文档中用@future标记来阅读。它给你更高的限制。尽管如此,一天只能调用这么多对象,因此可能需要以某种方式跟踪哪些父对象让其子对象更新,然后脱机处理。

    最后一个选择可能是通过一些外部工具使用api。但是您仍然需要确保代码中的所有内容都是成批的。

    我一开始以为这些限制很苛刻,但实际上如果批处理正确,您可以在其中做很多事情,我们定期从触发器更新1000行。从架构的角度来看,远不止这些,而且你实际上是在谈论批处理,不管怎样,这通常不是由触发器激活的。有一件事是肯定的——它们能让你跳出篮圈去做。

        2
  •  4
  •   Matt Lacey    14 年前

    解决这个问题最好(也是最简单)的方法是 Batch Apex ,您可以创建一个批处理类并从触发器触发它。就像@future,它在一个单独的线程中运行,但它可以处理多达50000000条记录!

    在使用之前,您需要向批处理类传递一些信息 database.executeBatch 这样它就有了要使用的父ID列表,或者您当然可以获得所有帐户;)

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

        3
  •  1
  •   Adam Butler    15 年前

    我认为codek是正确的,走api/外部工具路线是一个很好的方法。调控器限制仍然适用,但对api调用的要求要少得多。Salesforce最近改进了他们的数据加载器工具,所以这可能是一个值得研究的问题。

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

        4
  •  1
  •   eyescream    15 年前

    @未来不起作用(根本不更新记录)?奇怪的。你试过在自动测试中使用你的功能吗?它应该可以工作,并且应该忽略注释(在测试期间,它将立即执行,测试方法有更高的限制)。我建议你多调查一点,这似乎是你想要完成的最好的解决方案。

    还有-也许是你班上的同学,而不是扳机?

    菊花链触发器一起不会起作用,我在过去尝试过。

    你的最后一个选择可能是批量顶点(从2010年冬季发布,所以所有组织现在都应该拥有它)。这意味着大量的数据更新/验证工作,通常在普通数据库中运行一整夜(可以安排)。见 http://www.salesforce.com/community/winter10/custom-cloud/program-cloud-logic/batch-code.jsp 以及发行说明pdf。

        5
  •  0
  •   Daveo    15 年前

    我相信在18版的api中,1000的限制已经被删除。(所以文件上说,但在某些情况下,我还是达到了极限)

    所以你可以使用批处理顶点。使用单个apex update语句

    类似于:

    list children=新列表{};

    对于(childobect\uu c c:[选择….]){

    c.foo_u c='酒吧';

    增加(c);

    } 更新(子项);

    请你膨胀你的跳虎也看 http://sfdc.arrowpointe.com/2008/09/13/bulkifying-a-trigger-an-example/

        6
  •  0
  •   Hannes    14 年前

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