最近项目开始用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执行时,记录已经在数据库中保存但还未提交,这个状态下是可以检索到的,但是不能改。

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

 

SFDC Trigger里before和after的区别的更多相关文章

  1. jquery里prop和attr的区别

    本文通过具体的实例来讲述jquery里prop和attr的区别及使用方法. 在jquery里,我们要获取一个标签元素的属性,可以用attr或者prop,那么两者有什么区别呢? 其实很简单: attr可 ...

  2. sql中同一个Trigger里同时包含Insert,Update,Delete

    sql中同一个Trigger里同时包含Insert,Update,Delete SQLServer是靠Inserted表和Deleted表来处理的,判断一下就可以了,只不过比ORACLE麻烦一点 cr ...

  3. OJ提交题目中的语言选项里G++与C++的区别

    一.OJ提交题目中的语言选项里G++与C++的区别 http://www.th7.cn/Program/cp/201405/199001.shtml 首先更正一个概念,C++是一门计算机编程语言,G+ ...

  4. jq里attr和prop的区别

    jquery中attr和prop的区别   在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了. 关于它们两个的区别,网上的答 ...

  5. package.json 里 devDependencies和dependencies的区别

    我们在使用npm install 安装模块或插件的时候,有两种命令把他们写入到 package.json 文件里面去,比如: --save-dev --save 在 package.json 文件里面 ...

  6. OJ提交题目中的语言选项里G++与C++的区别(转)

    G++? 首先更正一个概念,C++是一门计算机编程语言,G++不是语言,是一款编译器中编译C++程序的命令而已. 那么他们之间的区别是什么? 在提交题目中的语言选项里,G++和C++都代表编译的方式. ...

  7. python的socket里 gethostbyname 与 gethostbyname_ex 的区别

    python里有一个模块,叫socket,提供了BSD socket 的通信接口,在看了这个模块之后,我发现了两个很相似的函数------gethostbyname 和gethostbyname_ex ...

  8. scala Option 里的 orNull orElse getOrElse 区别和使用

    Scala Option Scala Option类型用来表示一个值是可选的(有值或无值) Option[T] 是一个类型为 T 的可选值的容器: 如果值存在, Option[T] 就是一个 Some ...

  9. 说说单节点集群里安装hive、3\5节点集群里安装hive的诡异区别

    这几天,无意之间,被这件事情给迷惑,不解!先暂时贴于此,以后再解决! 详细问题如下: 在hive的安装目录下(我这里是 /home/hadoop/app/hive-1.2.1),hive的安装目录的l ...

随机推荐

  1. vue & arrow function error

    vue & arrow function error <template> <div class="home"> <img alt=" ...

  2. play games for learning web skills

    play games for learning web skills CSS flexbox https://codepip.com/games/flexbox-froggy/ CSS grid ht ...

  3. HTTP/2 & Push Cache

    HTTP/2 & Push Cache HTTP/2 & 推送缓存 https://caniuse.com/#search=http2 https://jakearchibald.co ...

  4. Flutter for web

    Flutter for web https://flutter.dev/web https://github.com/flutter/flutter_web Dart https://github.c ...

  5. taro render html

    taro render html html = `<h1 style='color: red'>Wallace is way taller than other reporters.< ...

  6. auto skip function args

    auto skip function args https://repl.it/@xgqfrms/auto-skip-function-args "use strict"; /** ...

  7. Error Code: 1452 Cannot add or update a child row: a foreign key constraint fails

    错误: Error Code: 1452 Cannot add or update a child row: a foreign key constraint fails 错误产生情景:我向一张带外键 ...

  8. elasticsearch如何设计索引

    本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 最近在做es相关的工作,所以记录下自己的一些想法,可能很多方面不会很全面,但是基本都是经过 ...

  9. spring-ioc的注解 理解-1

    简单对象注入的理解 用到了两个对象 Student .Wife ,一个xml配置(在idea编译器的resource文件下),主要是为让spring去扫描注解,一个测试类,一个pom.xml,导入需要 ...

  10. 微信小程序:block标签

    代码中存在block标签,但是渲染的时候会移除掉. 例子: 如果将view改为block: 当你要渲染某些数据时,如果不想额外的加一层外边的标签,此时可以使用block标签来进行占位.