最近项目开始用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. HTML5 Canvas 画图组件 All In One

    HTML5 Canvas 画图组件 All In One Canvas SVG Canvas + SVG refs https://www.infoq.cn/article/1BVg9VDSmqyHv ...

  2. GPU 加速 & WebGL

    GPU 加速 & WebGL 开启 GPU 加速, 硬件加速 垃圾面试官,瞎忽悠 holy shit 美国想象力英语,前端 leader WebGL 加速 ??? 是什么鬼 ??? three ...

  3. rename github

    rename GitHub github repo rename xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  4. nest cli bug

    nest cli bug Error: Collection "@nestjs/schematics" cannot be resolved. Error: Collection ...

  5. XPath in Action

    XPath in Action Python 爬虫 数据上报,可视化埋点 HTML / XHTML XML / XML Namespaces XPath XPath 是一门在 XML 文档中查找信息的 ...

  6. WiFi 测速

    WiFi 测速 shit 联通 20M => 电信 20M ? https://zhuanlan.zhihu.com/p/86140645 shit 房东 中国电信网络测速 50M http:/ ...

  7. js clear copy

    js clear copy window.getSelection().empty() & window.getSelection().removeAllRanges() & docu ...

  8. moment.js & convert timestamps to date string in js

    moment.js & convert timestamps to date string in js https://momentjs.com/ moment().format('YYYY- ...

  9. lua windows上使用vs编译Lua

    video 下载lua源文件 还有种方法: 创建空项目,取名lua,导入lua源文件 将luac.c移除,然后编译lua.exe 将lua.c移除,添加luac.c然后编译lua.exe后重命名位lu ...

  10. 一款基于 Web 的通用数据管理工具(转载)

    一款基于 WEB 的通用数据管控工具 - CloudQuery 前言 前段时间,公司因为业务发展,数据量攀升,老板迫切需要一个工具对数据进行精细化管理,一是确实需要精细化管理:二是因为我们公司小,数据 ...