SFDC Trigger里before和after的区别
最近项目开始用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的区别的更多相关文章
- jquery里prop和attr的区别
本文通过具体的实例来讲述jquery里prop和attr的区别及使用方法. 在jquery里,我们要获取一个标签元素的属性,可以用attr或者prop,那么两者有什么区别呢? 其实很简单: attr可 ...
- sql中同一个Trigger里同时包含Insert,Update,Delete
sql中同一个Trigger里同时包含Insert,Update,Delete SQLServer是靠Inserted表和Deleted表来处理的,判断一下就可以了,只不过比ORACLE麻烦一点 cr ...
- OJ提交题目中的语言选项里G++与C++的区别
一.OJ提交题目中的语言选项里G++与C++的区别 http://www.th7.cn/Program/cp/201405/199001.shtml 首先更正一个概念,C++是一门计算机编程语言,G+ ...
- jq里attr和prop的区别
jquery中attr和prop的区别 在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了. 关于它们两个的区别,网上的答 ...
- package.json 里 devDependencies和dependencies的区别
我们在使用npm install 安装模块或插件的时候,有两种命令把他们写入到 package.json 文件里面去,比如: --save-dev --save 在 package.json 文件里面 ...
- OJ提交题目中的语言选项里G++与C++的区别(转)
G++? 首先更正一个概念,C++是一门计算机编程语言,G++不是语言,是一款编译器中编译C++程序的命令而已. 那么他们之间的区别是什么? 在提交题目中的语言选项里,G++和C++都代表编译的方式. ...
- python的socket里 gethostbyname 与 gethostbyname_ex 的区别
python里有一个模块,叫socket,提供了BSD socket 的通信接口,在看了这个模块之后,我发现了两个很相似的函数------gethostbyname 和gethostbyname_ex ...
- scala Option 里的 orNull orElse getOrElse 区别和使用
Scala Option Scala Option类型用来表示一个值是可选的(有值或无值) Option[T] 是一个类型为 T 的可选值的容器: 如果值存在, Option[T] 就是一个 Some ...
- 说说单节点集群里安装hive、3\5节点集群里安装hive的诡异区别
这几天,无意之间,被这件事情给迷惑,不解!先暂时贴于此,以后再解决! 详细问题如下: 在hive的安装目录下(我这里是 /home/hadoop/app/hive-1.2.1),hive的安装目录的l ...
随机推荐
- vue & arrow function error
vue & arrow function error <template> <div class="home"> <img alt=" ...
- play games for learning web skills
play games for learning web skills CSS flexbox https://codepip.com/games/flexbox-froggy/ CSS grid ht ...
- HTTP/2 & Push Cache
HTTP/2 & Push Cache HTTP/2 & 推送缓存 https://caniuse.com/#search=http2 https://jakearchibald.co ...
- Flutter for web
Flutter for web https://flutter.dev/web https://github.com/flutter/flutter_web Dart https://github.c ...
- taro render html
taro render html html = `<h1 style='color: red'>Wallace is way taller than other reporters.< ...
- auto skip function args
auto skip function args https://repl.it/@xgqfrms/auto-skip-function-args "use strict"; /** ...
- 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 错误产生情景:我向一张带外键 ...
- elasticsearch如何设计索引
本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 最近在做es相关的工作,所以记录下自己的一些想法,可能很多方面不会很全面,但是基本都是经过 ...
- spring-ioc的注解 理解-1
简单对象注入的理解 用到了两个对象 Student .Wife ,一个xml配置(在idea编译器的resource文件下),主要是为让spring去扫描注解,一个测试类,一个pom.xml,导入需要 ...
- 微信小程序:block标签
代码中存在block标签,但是渲染的时候会移除掉. 例子: 如果将view改为block: 当你要渲染某些数据时,如果不想额外的加一层外边的标签,此时可以使用block标签来进行占位.