最近项目开始用Trigger来进行Validation Check.也知道可以通过配置Object里的Validation Rule来进行Check,但是项目想如果有Trigger里就都在Trigger里做Check算了,

分散开写反而也不好维护,一旦出问题了就得看两个地方,Apex里也比较自由,可以写共通类,有一些共通方法可以提一下,重用。

回到主题,目前有个Object比较特殊,它会参照另一个Object。并且每个父Object只能有两个子Object。

要用Trigger来进行Check,如果一个父Object下已经有两个子Object了,就addError(),报一个错。

这里我研究了下Before Trigger 和After Trigger。对保存的执行顺序有了更深的理解。

就比如现在这个Object,一共有三条数据。

我编写了一个before insert Trigger,在里面直接查询表并打log看看当时一共有几个数据。

1 trigger RSRecordTrigger on RSRecord__c (before insert) {
2 For(RSRecord__c record : Trigger.new){
3 List<RSRecord__c> exists = [Select Id,Name From RSRecord__c];
4 System.debug('exists:'+exists);
5 record.addError('Test');
6 }
7 }

添加画面

看一眼log

17:40:21:005 USER_DEBUG [4]|DEBUG|
exists:(
RSRecord__c:{Id=a074x000002djNJAAY, Name=1234567890-1},
RSRecord__c:{Id=a074x000002dw6dAAA, Name=Test 1},
RSRecord__c:{Id=a074x000002dw6YAAQ, Name=Test}
) 

 很明显,只有三条。也就是说 before Trigger里画面上输入的记录查询不到。

接下来测测After Trigger

trigger RSRecordTrigger on RSRecord__c (after insert) {
For(RSRecord__c record : Trigger.new){
List<RSRecord__c> exists = [Select Id,Name From RSRecord__c];
System.debug('exists:'+exists);
record.addError('Test after');
}
}

 画面不用动,直接点保存 

 

Error Message变了,看看Log

17:43:44:006 USER_DEBUG [4]|DEBUG|exists:(
RSRecord__c:{Id=a074x000002djNJAAY, Name=1234567890-1},
RSRecord__c:{Id=a074x000002dwLvAAI, Name=999},
RSRecord__c:{Id=a074x000002dw6dAAA, Name=Test 1},
RSRecord__c:{Id=a074x000002dw6YAAQ, Name=Test})

 明显After Trigger会显示刚才画面上输入的记录

原因是,After Trigger执行时,记录已经在数据库中保存但还未提交,这个状态下是可以检索到的,但是不能改。

附上完整的保存执行顺序图

 

最新文章

  1. NTP时间同步
  2. 使用阿里云负载均衡遭遇的http重定向https的问题
  3. js基础-表单验证和提交
  4. extjs的一些简单动画1
  5. Log4j、slf4j
  6. C#.NET U盘插拔监控
  7. asp.net Context.User.Identity.Name说明
  8. 汉诺塔-Hanoi
  9. C++格式化字符函数
  10. [Machine Learning] 深度学习中消失的梯度
  11. 老李分享:loadrunner 的86401错误
  12. 关于LINUX各类系统资源整合
  13. [Swift]LeetCode402. 移掉K位数字 | Remove K Digits
  14. Actifio如何保护和管理Oracle-带外篇
  15. BZOJ1066 [SCOI2007]蜥蜴 网络流 最大流 SAP
  16. 使用 Navicate 连接 Oracle9i 数据库
  17. Bayesian Personalized Ranking 算法解析及Python实现
  18. Mac 下重新安装配置ibm Lotus 邮箱
  19. 每帧创建一个item
  20. SQLI DUMB SERIES-3

热门文章

  1. BB link
  2. Xcode 格式化 SwiftUI代码
  3. node cli &amp; emoji
  4. 如何关闭 iPad Pro 自动开启 wifi 和蓝牙
  5. how to copy to clipboard using windows cmd
  6. AMP ⚡️原理
  7. vue watch &amp; arrow function bug
  8. Flutter-desktop
  9. 如何快速搞定websocket
  10. Vue学习笔记-VSCode安装与配置