【问题标题】:Bulk Before Delete Trigger (Too Many Soql Statements) Salesforce.com删除前批量触发(Soql 语句过多)Salesforce.com
【发布时间】:2011-11-03 17:59:07
【问题描述】:

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

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

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

  1. 检查静态类变量是否为真。

  2. 如果变量不是真正的构建映射。

  3. 将静态类变量设置为 true。

  4. 执行触发器操作。

对于插入/更新触发器,会话状态保持不变,静态类变量直到批量操作结束后才会重置。

但是对于删除前触发器,似乎没有会话状态,并且每次删除记录时都会重置会话。会话被重置,但是对于记录的批量删除,管理器限制是累积的。因此,使用删除前触发器,即使使用映射,soql 查询计数也会一直计数到臭名昭著的“太多 Sql 查询”限制,即删除超过 100 条记录。

任何关于如何防止遇到 SOQL 限制的想法将不胜感激。我无法在任何地方找到任何内容。

【问题讨论】:

    标签: triggers salesforce bulk soql cascading-deletes


    【解决方案1】:

    您可以采取的一种选择是使用触发器来安排batch apex class for execution。对于哪个对象是启动级联删除的对象,使用触发器创建批处理的实例,将源 ID 列表传递给它。

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

    除此之外,它可能只是优化代码的一种情况,以便级联删除始终在尽可能大的列表上工作(当然最多 200 个限制),或者您可以使用主从关系来处理给你一些删除操作?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      • 2020-03-12
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      相关资源
      最近更新 更多