我在后触发器中出现错误问题,而且我没有看到任何可以单向提出错误的原因,而不是另一方面。我举个例子。
以下触发器将失败并引发以下错误:
错误:Apex触发器tstTrigger2导致意外异常,联系 您的管理员:tstTrigger2:执行AfterUpdate导致: System.FinalException:SObject行不允许错误: Trigger.tstTrigger2:第19行,第1列
trigger tstTrigger2 on Account (after update)
{
Set<Id> AccountIds = Trigger.newMap.keySet();
List<Account > accountsToProcess = [Select Id, Name from Account Where Id IN : AccountIds];
for(Account act: accountsToProcess)
{
act.addError('doesn't work');
}
}
然而,以这种方式引发错误是有效的。请注意,密钥集中始终只有1条记录,至少在此测试场景中是这样。
trigger tstTrigger on Account (after update)
{
Set<Id> AccountIds = Trigger.newMap.keySet();
List<Account > accountsToProcess = [Select Id, Name from Account Where Id IN : AccountIds];
Trigger.new[0].addError('However, this works?');
}
对于为什么第一个失败而第二个失败的任何解释都非常感谢。同样,如果你能指出我实现这一目标的最佳方式,那么它将被批量化,这将是非常好的。谢谢!
答案 0 :(得分:1)
addError()不会回滚您的插入,只会阻止脚本的进一步执行,因此如果您在UI上抛出错误,则永远不会插入数据。
通过这样做
Trigger.new[0].addError('However, this works?');
你只是在列表中的第一条记录上抛出错误,从而停止任何处理。
这样的东西将解决你的第一个代码片段
trigger tstTrigger2 on Account (after update)
{
Map<ID, Account> accountMap = Trigger.newMap;
for(ID act: accountMap.keySet())
{
accountMap.get(act).addError('doesnt work');
}
}
您正在查询帐户ID并且到那时他们已经提交到数据库,这将不允许在记录上标记错误