0

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

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

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

  1. 检查静态类变量是否不正确。

  2. 如果变量不是真正的构建地图。

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

  4. 执行触发操作。

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

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

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

4

1 回答 1

1

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

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

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

于 2011-11-04T00:16:04.017 回答