Triggers 删除触发器前批量(太多Soql语句)Salesforce.com

Triggers 删除触发器前批量(太多Soql语句)Salesforce.com,triggers,salesforce,bulk,soql,cascading-deletes,Triggers,Salesforce,Bulk,Soql,Cascading Deletes,我有一个庞大的触发器,它使用映射来避免遇到SOQL调控器的限制。此触发器还使用静态类变量进行递归和限制查询 我正在做的是,当在对象上启动批量操作(如插入或更新)时,在这种情况下,Contact对象,然后触发器将在第一个触发器上构建相关帐户的映射,并将这些映射用于其余的触发器触发 下面是一个运行良好的操作示例,但仅适用于更新后和插入后触发器操作: 检查静态类变量是否为true 如果变量不为true,则生成映射 将静态类变量设置为true 执行触发操作 对于insert/update触发器,会话状态

我有一个庞大的触发器,它使用映射来避免遇到SOQL调控器的限制。此触发器还使用静态类变量进行递归和限制查询

我正在做的是,当在对象上启动批量操作(如插入或更新)时,在这种情况下,Contact对象,然后触发器将在第一个触发器上构建相关帐户的映射,并将这些映射用于其余的触发器触发

下面是一个运行良好的操作示例,但仅适用于更新后和插入后触发器操作:

  • 检查静态类变量是否为true

  • 如果变量不为true,则生成映射

  • 将静态类变量设置为true

  • 执行触发操作

  • 对于insert/update触发器,会话状态保持不变,静态类变量直到批量操作结束后才会重置

    但是,对于before delete触发器,似乎没有会话状态,每次删除记录时都会重置会话。会话已重置,但调控器限制是批量删除记录的累积限制。因此,在使用before delete触发器时,即使使用映射,soql查询计数也会持续计数,达到臭名昭著的“太多Sql查询”限制,可以删除100多条记录


    任何关于如何防止运行到SOQL限制的想法都将不胜感激。我在任何地方都找不到这方面的任何信息。

    您可以选择的一个选项是使用触发器来安排一个任务。对于启动级联删除的ever对象,使用触发器创建批处理实例,并向其传递源ID列表

    然后,在batch类的execute方法中,您可以为每个批次构建映射等,并在其中执行删除。Batch apex以牺牲同步执行为代价,具有相当高的调控器限制,也就是说,该过程通常会在操作后几秒钟内启动

    除此之外,它可能只是优化代码的一种情况,以便级联删除总是在尽可能大的列表上工作(当然最多不超过200个),或者您可以使用主-详细关系来处理一些删除操作