Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Triggers 超越Salesforce触发器管理器_Triggers_Salesforce_Bulk - Fatal编程技术网

Triggers 超越Salesforce触发器管理器

Triggers 超越Salesforce触发器管理器,triggers,salesforce,bulk,Triggers,Salesforce,Bulk,我正在尝试编写一个更新后触发器,该触发器对刚刚更新的记录的所有子记录进行批更新。这需要能够一次处理15k+子记录。不幸的是,限制似乎是100,这远远低于我的需要,甚至不接近可接受的。我还没有尝试过将记录分成100个批次,因为这样每次触发器执行的更新次数上限仍然是10k。也许我可以一起用菊花链?啊 有人知道我可以通过什么系列的篮球来克服这个限制吗 编辑:我尝试在触发器中调用以下@future函数,但它从未更新子记录: global class ParentChildBulkUpdater {

我正在尝试编写一个更新后触发器,该触发器对刚刚更新的记录的所有子记录进行批更新。这需要能够一次处理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;

    }
}

比这更糟糕的是,你甚至不能在第一时间获得那些15k的记录,因为触发器中有1000行的查询限制,这会扩展到触发器被调用的行数,但这可能没有帮助

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

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


起初我认为这些限制很严格,但实际上,如果你正确地批处理事情,你可以在这些限制范围内做很多事情,我们定期从触发器更新1000行。从体系结构的角度来看,这远远不止于此,你实际上是在谈论批处理,它通常不是由触发器激活的。有一件事是肯定的——它们会让你跳过重重障碍去做。

比这更糟糕的是,你甚至无法首先获得那些15k记录,因为触发器中有1000行的查询限制,这会扩展到调用触发器的行数,但这可能没有帮助

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

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


起初我认为这些限制很严格,但实际上,如果你正确地批处理事情,你可以在这些限制范围内做很多事情,我们定期从触发器更新1000行。从体系结构的角度来看,这远远不止于此,你实际上是在谈论批处理,它通常不是由触发器激活的。有一件事是肯定的——它们会让你跳出困境去做这件事。

我认为Codek是对的,走API/外部工具的路线是一个好办法。调控器限制仍然适用,但对API调用的要求要低得多。Salesforce最近更新了他们的DataLoader工具,所以这可能是一个值得研究的问题


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

我认为Codek是正确的,采用API/外部工具路线是一个好办法。调控器限制仍然适用,但对API调用的要求要低得多。Salesforce最近更新了他们的DataLoader工具,所以这可能是一个值得研究的问题


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

我相信在API的第18版中,1000限制已被取消。文件上说,但在某些情况下,我还是达到了极限

因此,您可以使用batch apex。使用单个APEX update语句

比如:

列表子项=新列表{}

forchildObect\uuu c:[选择….]{

c、 foo_uuc=‘bar’

children.addc

} 更新儿童


请确保你的跳跳虎也可以看到

我相信在API的第18版中,1000的限制已经取消了。文件上说,但在某些情况下,我还是达到了极限

所以你可以用b 阿奇顶点。使用单个APEX update语句

比如:

列表子项=新列表{}

forchildObect\uuu c:[选择….]{

c、 foo_uuc=‘bar’

children.addc

} 更新儿童


确保你的跳跳虎也能看到“未来不工作”根本不更新记录?奇怪的您是否尝试在自动测试中使用您的功能?它应该可以工作,并且在测试过程中应该忽略注释。它将立即执行,测试方法有更高的限制。我建议您对此进行更多的调查,这似乎是实现您想要实现的目标的最佳解决方案

还有-也许试着从你的课堂上调用它,而不是触发器

用菊花链把触发器连在一起是行不通的,我以前也试过


您的最后一个选择可能是Winter'10版本中的batch Apex,因此所有组织现在都应该拥有它。它适用于大规模数据更新/验证作业,通常在普通数据库中通宵运行的任务可以安排。请参阅和发行说明PDF。

@future不起作用根本不更新记录?奇怪的您是否尝试在自动测试中使用您的功能?它应该可以工作,并且在测试过程中应该忽略注释。它将立即执行,测试方法有更高的限制。我建议您对此进行更多的调查,这似乎是实现您想要实现的目标的最佳解决方案

还有-也许试着从你的课堂上调用它,而不是触发器

用菊花链把触发器连在一起是行不通的,我以前也试过


您的最后一个选择可能是Winter'10版本中的batch Apex,因此所有组织现在都应该拥有它。它适用于大规模数据更新/验证作业,通常在普通数据库中通宵运行的任务可以安排。请参阅和发行说明PDF。

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

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

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

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


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

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

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


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

子记录更新必须在同一事务中进行吗?@Adam不,不是。它最终必须发生。子记录更新必须在同一个事务中发生吗?@Adam不,不是。这终究会发生。我尝试了@future方法路线,但它似乎并没有在我的沙箱中启动-我需要等待多久才能启动它们?@Jake根据我的经验,@future方法在几秒钟内执行。检查设置>监视>Apex作业,查看您的作业是否正在运行executed@Adam/@Codek,你们中有人能看一下我在主帖中提到的@future方法吗?有什么原因不能像我期望的那样更新子级吗?您需要将Site列添加到SOQL语句中,更新才能正常工作。测试这种东西的一种方法是从系统日志中手动调用它。多谢了,您帮了大忙。我现在打算使用一个外部API工具,一旦我们得到一些托管,就转移到一个API web服务。我尝试了@future方法路线,但它似乎没有在我的沙箱中启动-我需要等待多久才能启动这些工具?@Jake在我的经验中,@future方法会在几秒钟内执行。检查设置>监视>Apex作业,查看您的作业是否正在运行executed@Adam/@Codek,你们中有人能看一下我在主帖中提到的@future方法吗?有什么原因不能像我期望的那样更新子级吗?您需要将Site列添加到SOQL语句中,更新才能正常工作。测试这种东西的一种方法是从系统日志中手动调用它。多谢了,您帮了大忙。我要用一个外部A
现在使用PI工具,一旦我们得到一些托管,就立即转到API web服务。可能会出现这种情况…顺便说一句,感谢关于立即响应的警告。可能会出现这种情况…顺便说一句,感谢关于立即响应的警告。我使用的是v18触发器,我达到了400的上限。它已经进行了扩展,因此只有一次选择和一次更新。我得到的错误表明问题在于DML语句的大小。有趣的是,你在哪里看到这个?这里的文档仍然显示限制为1000:但是,在batch apex上也有一些很好的注释,这可能是一种解决方法:我使用的是v18触发器,我达到了400的限制。它已经进行了扩展,因此只有一次选择和一次更新。我得到的错误表明问题在于DML语句的大小。有趣的是,你在哪里看到这个?这里的文档仍然显示限制为1000:但是,在批处理apex上也有一些好的注释,这可能是这里的发展方向:您能解释一下:将触发器串联在一起将不起作用,我过去曾尝试过。@Aequitas您知道这个线程已经9年了吗?自那以后,限额增加了,我们更新了1K记录,最多20次查询;每个人都可以使用batch apex,我们有@future、Continuation和Queueable。。。可能会在你的问题中提出新问题。我想我当时的意思是OP试图更新200个联系人,然后联系触发器查询此主机是否还有未处理的联系人并触发下一次更新。。。不会改变任何东西,您仍然可以在单个事务中更新10K记录,甚至可能达到递归限制20次调用,我想您可以解释一下:将触发器链接在一起将不起作用,我过去已经尝试过了。@Aequitas您是否意识到此线程已有9年历史?自那以后,限额增加了,我们更新了1K记录,最多20次查询;每个人都可以使用batch apex,我们有@future、Continuation和Queueable。。。可能会在你的问题中提出新问题。我想我当时的意思是OP试图更新200个联系人,然后联系触发器查询此主机是否还有未处理的联系人并触发下一次更新。。。不会改变任何东西,您仍然可以在单个事务中更新10K记录,我认为可能会达到递归限制20次调用