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 ...
随机推荐
- TypedArray & ArrayBuffer
TypedArray & ArrayBuffer Type Each element size in bytes Int8Array 1 Uint8Array 1 Uint8ClampedAr ...
- Object to Array
Object to Array objectToArray(obj = {}, title = `标题`){ let datas = []; if(Object.keys(obj).length) { ...
- js replace all & replaceAll
js replace all & replaceAll https://scotch.io/tutorials/javascript-replace-all-instances-of-a-st ...
- 投资者通过这几种方式可以快速在NGK赚取收益
2020年全球经济危机,各国经济持续低迷,资本市场变得躁动不安.而区块链市场,却异常火爆.各种公链项目相继而起,DeFi.分布式存储一个比一个火爆.NGK公链,无疑成为了这场热潮中有力的推动者之一,一 ...
- NGK公链:去中心化交易+挖矿生态体系共舞
NGK生态公链是一个安全.透明.专业的去中心化商业应用平台.作为一条具有技术信任甚至是公众信任的公链,NGK以区块链技术为支撑,利用区块链透明.公正.公开.数据不可篡改.分布式存储.可追溯等技术优势, ...
- 【Python核心编程笔记】一、Python中一切皆对象
Python中一切皆对象 本章节首先对比静态语言以及动态语言,然后介绍 python 中最底层也是面向对象最重要的几个概念-object.type和class之间的关系,以此来引出在python如何做 ...
- CF102920L Two Buildings【分治】【决策单调性】
优秀的分治题目.是"2020-2021 ACM-ICPC, Asia Seoul Regional Contest"的一道题. Description There are \(n\ ...
- [转]ROS订阅激光数据
https://github.com/robopeak/rplidar_ros/blob/master/src/client.cpp /* * Copyright (c) 2014, RoboPe ...
- Power Query 合并数据
1 导入数据 合并数据 筛选字段 关闭并上载
- 面试必知:String、StringBuilder、StringBuffer的区别
你知道String.StringBuilder.Stringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗? 别急,这篇文章带你解决这些问题. 可变性 首先,String是字符串,我 ...