初学Salesforce 的Apex开发,trigger可以说的开发者的基本功了。

trigger的定义模式如下:

trigger TriggerName on ObjectName (trigger_events) {code_block
}

triggerName相当于trigger的命名,ObjectName指trigger绑定的类的名字,trigger_events指能引起代码触发的条件,主要有insert,update,delete,merge,upsert,undelete六种,本文主要介绍insert,update和delete三种。

trigger的类型包括两种

  • Before trigger:通常用于在他们被保存在数据库以前更新或者校验数据;
  • After Trigger: 通常用于保存后访问系统的字段(Id等).

创建一个测试用例TestTrigger__c,里面含字段status__c,触发器代码如下:

trigger testTrigger on TestTrigger__c (before insert,before update,before delete,after insert,after update,after delete) {if(trigger.isBefore){//插入前if(trigger.isInsert){System.debug('*******插入前trigger.new********' + trigger.new);     System.debug('*******插入前trigger.newMap********' + trigger.newMap);System.debug('*******插入前trigger.old********' + trigger.old);System.debug('*******插入前trigger.oldMap********' + trigger.oldMap);   }//更新前if(trigger.isUpdate){System.debug('*******更新前trigger.new********' + trigger.new);System.debug('*******更新前trigger.newMap********' + trigger.newMap);System.debug('*******更新前trigger.old********' + trigger.old); System.debug('*******更新前trigger.oldMap********' + trigger.oldMap);}//删除前if(trigger.isDelete){ System.debug('*******删除前trigger.new********' + trigger.new); System.debug('*******删除前trigger.newMap********' + trigger.newMap);System.debug('*******删除前trigger.old********' + trigger.old);System.debug('*******删除前trigger.oldMap********' + trigger.oldMap);}}if(trigger.isAfter){//插入后if(trigger.isInsert){ System.debug('*******插入后trigger.new********' + trigger.new);       System.debug('*******插入后trigger.newMap********' + trigger.newMap);System.debug('*******插入后trigger.old********' + trigger.old);System.debug('*******插入后trigger.oldMap********' + trigger.oldMap);       }//更新后if(trigger.isUpdate){ System.debug('*******更新后trigger.new********' + trigger.new);System.debug('*******更新后trigger.newMap********' + trigger.newMap);System.debug('*******更新后trigger.old********' + trigger.old); System.debug('*******更新后trigger.oldMap********' + trigger.oldMap);}//删除后if(trigger.isDelete){System.debug('*******删除后trigger.new********' + trigger.new); System.debug('*******删除后trigger.newMap********' + trigger.newMap);System.debug('*******删除后trigger.old********' + trigger.old);System.debug('*******删除后trigger.oldMap********' + trigger.oldMap);}}
}

新建一个 TestTrigger__c对象,控制台输出可以看到:

*******插入前trigger.new********(TestTrigger__c:{Id=null, OwnerId=0057F000000ySVPQA2, IsDeleted=false, Name=null, CreatedDate=null, CreatedById=null, LastModifiedDate=null, LastModifiedById=null, SystemModstamp=null, LastActivityDate=null, LastViewedDate=null, LastReferencedDate=null, address__c=触发器测试数据, status__c=状态一})
*******插入前trigger.newMap********null
*******插入前trigger.old********null
*******插入前trigger.oldMap********null
*******插入后trigger.new********(TestTrigger__c:{Id=a007F000003AzKwQAK, OwnerId=0057F000000ySVPQA2, IsDeleted=false, Name=R-0006, CreatedDate=2017-08-21 03:14:49, CreatedById=0057F000000ySVPQA2, LastModifiedDate=2017-08-21 03:14:49, LastModifiedById=0057F000000ySVPQA2, SystemModstamp=2017-08-21 03:14:49, LastActivityDate=null, LastViewedDate=null, LastReferencedDate=null, address__c=触发器测试数据, status__c=状态一})
*******插入后trigger.newMap********{a007F000003AzKwQAK=TestTrigger__c:{Id=a007F000003AzKwQAK, OwnerId=0057F000000ySVPQA2, IsDeleted=false, Name=R-0006, CreatedDate=2017-08-21 03:14:49, CreatedById=0057F000000ySVPQA2, LastModifiedDate=2017-08-21 03:14:49, LastModifiedById=0057F000000ySVPQA2, SystemModstamp=2017-08-21 03:14:49, LastActivityDate=null, LastViewedDate=null, LastReferencedDate=null, address__c=触发器测试数据, status__c=状态一}}
*******插入后trigger.old********null
*******插入后trigger.oldMap********null

修改对象,控制台输出看到:

*******更新前trigger.new********(TestTrigger__c:{Id=a007F000003AzKwQAK, OwnerId=0057F000000ySVPQA2, IsDeleted=false, Name=R-0006, CreatedDate=2017-08-21 03:14:49, CreatedById=0057F000000ySVPQA2, LastModifiedDate=2017-08-21 03:14:49, LastModifiedById=0057F000000ySVPQA2, SystemModstamp=2017-08-21 03:14:49, LastActivityDate=null, LastViewedDate=null, LastReferencedDate=null, address__c=触发器测试数据, status__c=状态二})
*******更新前trigger.newMap********{a007F000003AzKwQAK=TestTrigger__c:{Id=a007F000003AzKwQAK, OwnerId=0057F000000ySVPQA2, IsDeleted=false, Name=R-0006, CreatedDate=2017-08-21 03:14:49, CreatedById=0057F000000ySVPQA2, LastModifiedDate=2017-08-21 03:14:49, LastModifiedById=0057F000000ySVPQA2, SystemModstamp=2017-08-21 03:14:49, LastActivityDate=null, LastViewedDate=null, LastReferencedDate=null, address__c=触发器测试数据, status__c=状态二}}
*******更新前trigger.old********(TestTrigger__c:{Id=a007F000003AzKwQAK, OwnerId=0057F000000ySVPQA2, IsDeleted=false, Name=R-0006, CreatedDate=2017-08-21 03:14:49, CreatedById=0057F000000ySVPQA2, LastModifiedDate=2017-08-21 03:14:49, LastModifiedById=0057F000000ySVPQA2, SystemModstamp=2017-08-21 03:14:49, LastActivityDate=null, LastViewedDate=null, LastReferencedDate=null, address__c=触发器测试数据, status__c=状态一})
*******更新前trigger.oldMap********{a007F000003AzKwQAK=TestTrigger__c:{Id=a007F000003AzKwQAK, OwnerId=0057F000000ySVPQA2, IsDeleted=false, Name=R-0006, CreatedDate=2017-08-21 03:14:49, CreatedById=0057F000000ySVPQA2, LastModifiedDate=2017-08-21 03:14:49, LastModifiedById=0057F000000ySVPQA2, SystemModstamp=2017-08-21 03:14:49, LastActivityDate=null, LastViewedDate=null, LastReferencedDate=null, address__c=触发器测试数据, status__c=状态一}}
*******更新后trigger.new********(TestTrigger__c:{Id=a007F000003AzKwQAK, OwnerId=0057F000000ySVPQA2, IsDeleted=false, Name=R-0006, CreatedDate=2017-08-21 03:14:49, CreatedById=0057F000000ySVPQA2, LastModifiedDate=2017-08-21 03:16:58, LastModifiedById=0057F000000ySVPQA2, SystemModstamp=2017-08-21 03:16:58, LastActivityDate=null, LastViewedDate=null, LastReferencedDate=null, address__c=触发器测试数据, status__c=状态二})
*******更新后trigger.newMap********{a007F000003AzKwQAK=TestTrigger__c:{Id=a007F000003AzKwQAK, OwnerId=0057F000000ySVPQA2, IsDeleted=false, Name=R-0006, CreatedDate=2017-08-21 03:14:49, CreatedById=0057F000000ySVPQA2, LastModifiedDate=2017-08-21 03:16:58, LastModifiedById=0057F000000ySVPQA2, SystemModstamp=2017-08-21 03:16:58, LastActivityDate=null, LastViewedDate=null, LastReferencedDate=null, address__c=触发器测试数据, status__c=状态二}}
*******更新后trigger.old********(TestTrigger__c:{Id=a007F000003AzKwQAK, OwnerId=0057F000000ySVPQA2, IsDeleted=false, Name=R-0006, CreatedDate=2017-08-21 03:14:49, CreatedById=0057F000000ySVPQA2, LastModifiedDate=2017-08-21 03:14:49, LastModifiedById=0057F000000ySVPQA2, SystemModstamp=2017-08-21 03:14:49, LastActivityDate=null, LastViewedDate=null, LastReferencedDate=null, address__c=触发器测试数据, status__c=状态一})
*******更新后trigger.oldMap********{a007F000003AzKwQAK=TestTrigger__c:{Id=a007F000003AzKwQAK, OwnerId=0057F000000ySVPQA2, IsDeleted=false, Name=R-0006, CreatedDate=2017-08-21 03:14:49, CreatedById=0057F000000ySVPQA2, LastModifiedDate=2017-08-21 03:14:49, LastModifiedById=0057F000000ySVPQA2, SystemModstamp=2017-08-21 03:14:49, LastActivityDate=null, LastViewedDate=null, LastReferencedDate=null, address__c=触发器测试数据, status__c=状态一}}

删除对象,控制台输出可以看到:

*******删除前trigger.new********null
*******删除前trigger.newMap********null
*******删除前trigger.old********(TestTrigger__c:{Id=a007F000003AzKwQAK, OwnerId=0057F000000ySVPQA2, IsDeleted=false, Name=R-0006, CreatedDate=2017-08-21 03:14:49, CreatedById=0057F000000ySVPQA2, LastModifiedDate=2017-08-21 03:16:58, LastModifiedById=0057F000000ySVPQA2, SystemModstamp=2017-08-21 03:16:58, LastActivityDate=null, LastViewedDate=null, LastReferencedDate=null, address__c=触发器测试数据, status__c=状态二})
*******删除前trigger.oldMap********{a007F000003AzKwQAK=TestTrigger__c:{Id=a007F000003AzKwQAK, OwnerId=0057F000000ySVPQA2, IsDeleted=false, Name=R-0006, CreatedDate=2017-08-21 03:14:49, CreatedById=0057F000000ySVPQA2, LastModifiedDate=2017-08-21 03:16:58, LastModifiedById=0057F000000ySVPQA2, SystemModstamp=2017-08-21 03:16:58, LastActivityDate=null, LastViewedDate=null, LastReferencedDate=null, address__c=触发器测试数据, status__c=状态二}}
*******删除后trigger.new********null
*******删除后trigger.newMap********null
*******删除后trigger.old********(TestTrigger__c:{Id=a007F000003AzKwQAK, OwnerId=0057F000000ySVPQA2, IsDeleted=false, Name=R-0006, CreatedDate=2017-08-21 03:14:49, CreatedById=0057F000000ySVPQA2, LastModifiedDate=2017-08-21 03:16:58, LastModifiedById=0057F000000ySVPQA2, SystemModstamp=2017-08-21 03:16:58, LastActivityDate=null, LastViewedDate=null, LastReferencedDate=null, address__c=触发器测试数据, status__c=状态二})
*******删除后trigger.oldMap********{a007F000003AzKwQAK=TestTrigger__c:{Id=a007F000003AzKwQAK, OwnerId=0057F000000ySVPQA2, IsDeleted=false, Name=R-0006, CreatedDate=2017-08-21 03:14:49, CreatedById=0057F000000ySVPQA2, LastModifiedDate=2017-08-21 03:16:58, LastModifiedById=0057F000000ySVPQA2, SystemModstamp=2017-08-21 03:16:58, LastActivityDate=null, LastViewedDate=null, LastReferencedDate=null, address__c=触发器测试数据, status__c=状态二}}

上述结果可以看到,trigger.new等变量不是在任何时候都会有值,当它实际上等于null的时候,在trigger_events下是没有意义的。

对于trigger中的new/old变量需要注意的是,它的实质的一个List集合的存储形式,里面包含的不仅只是一个对象的值,更多的是针对批处理的情况、Apex开发后期使用DataLoader导入用户数据就是很典型的一种批处理场景。所以在开发的时候,我们更多的要针对多条数据进行处理。

List<TestTrigger__c>  list_test = trigger.new
if(trigger.isBefore){
    //插入前
    if(trigger.isInsert){
        for(TestTrigger__c test: trigger.new){
            test.status__c = '状态二';
        }
    }
}

每次新建TestTrigger__c对象的时候,将状态都修改为“状态二”

而对于trigger中的newmap/oldmap变量,实质是一个map存储了对象的ID和对象,通过ID可以取出对应的SObject。

下面举个例子

trigger testTrigger on TestTrigger__c (after update) {TestTriggerHandle handler =  new  TestTriggerHandle();if(trigger.IsUpdate && trigger.isAfter)}     handler.OnAfterUpdate(trigger.new,trigger.oldMap);}
}
/***  Author:小青 *  Time:2017-8-21*  Function:TestTrigger__c的状态发生变化**/
public class TestTriggerHandle {public void OnAfterUpdate(List<TestTrigger__c> list_test,Map<Id,TestTrigger__c> map_old){       Set<Id>  set_id = new Set<Id>();//记录被修改的TestTrigger__c的IDfor(TestTrigger__c test : list_test){set_id.add(test.Id);            }        List<TestTrigger__c> list_update = [Select Id,status__c From TestTrigger__c  where Id in :set_id];for(TestTrigger__c test : advList){           TestTrigger__c oldTest = map_old.get(ad.Id); if(test.status__c != oldTest.status__c){System.debug('测试数据的状态发生了修改,原状态为:' + oldTest.status__c + '新的状态为' + test.status__c);}}
}

以上是常用的触发器开发的方法,逻辑处理放在一个Handler类中,在触发器中调用handler类的方法进行处理,从而实现代码的分离,便于控制代码的执行顺序以及避免业务逻辑过于复杂。

最后,对于触发器的开发需要理解,例如trigger.new在before insert中,不需要进行DML操作就可以直接修改记录的数据,然后就能进行保存,而在After Update中,并不能直接使用trigger.new所代表是数据,因为这条记录已经被插入到数据库中,这时候直接进行DML操作会报错,所以需要我们用一个set记录下对应的ID然后再进行一次查询,对这个查询出来的集合重新DML操作就没有问题了。

SFDC之trigger那些事儿相关推荐

  1. java前端目录_[Java教程]前端那点事儿——Tocify自动生成文档目录

    [Java教程]前端那点事儿--Tocify自动生成文档目录 0 2016-06-29 22:00:07 今天偶然间看到文档服务器有一个动态目录功能,点击目录能跳转到指定的位置:窗口滑动也能自动更新目 ...

  2. 高能预警:SFDC安全技术大会将于11月19日在北京举办,岂安科技CEO罗启武受邀演讲

    SegmentFault 面向全国开发者的技术大会--SegmentFault Developer Conference 2016(以下简称 SFDC), 将于 11.19 和 12.10 先后在北京 ...

  3. antd vue form 手动校验_Ant Design 4.0 的一些杂事儿 - Form 篇

    上一篇:Ant Design 4.0 的一些杂事儿 - Table 篇 是的,趁着手热,于是又开了一篇新的文章,用来讲讲我们在开发 Ant Design 4.0 的 Form 时遇到的一些杂事儿.当然 ...

  4. 关于Salesforce里的Trigger

    首先SFDC里的Trigger和Oracle的Trigger是一个东西,(Oracle里的Trigger怎么用问百度吧!) 其次SFDC里的Trigger有些特殊,和注意事项,这里主要讲这里 http ...

  5. 【5G RRC】5G 切换(handover)那点事儿

    博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G ...

  6. sqlserver trigger

    1 --==================================== 2 -- Create database trigger template 3 --================= ...

  7. webassembly类型_WebAssembly 那些事儿

    WebAssembly 那些事儿 什么是 WebAssembly? WebAssembly 是除 JavaScript 以外,另一种可以在网页中运行的编程语言,并且相比之下在某些功能和性能问题上更具优 ...

  8. 计算机网络技术社团纳新海报,精品社团纳新 | 加入计算机协会和我一起做些有意义的事儿吧~...

    原标题:精品社团纳新 | 加入计算机协会和我一起做些有意义的事儿吧~ 我们是谁? 计算机协会 社团 简介 社团名称:计算机协会 创办时间:2012年 组成部门:技术部,宣传部,秘书部,外联部,策划部. ...

  9. Linux那些事儿 之 戏说USB(33)字符串描述符

    关于字符串描述符,前面的前面已经简单描述过了,地位仅次于设备/配置/接口/端点四大描述符,那四大设备必须得支持,而字符串描述符对设备来说则是可选的. 这并不是就说字符串描述符不重要,对咱们来说,字符串 ...

最新文章

  1. Java中FTPClient上传中文目录、中文文件名乱码问题解决方法
  2. python装饰器函数-python之路——装饰器函数
  3. Oracle 要慌了!华为终于开源了自家的 Huawei JDK——毕昇 JDK!
  4. android 获取控件高度_安卓开发入门教程UI控件_ImageView
  5. 【机器学习】逻辑回归优化技巧总结(全)
  6. 本人对于netty框架的一些理解,怎么与网站上的websock建立连接
  7. web框架django初探
  8. Could not execute query against OLE DB provider 'OraOLEDB.Oracle'
  9. qt不规则按钮样式在自适应分辨率时应该注意的图片缩放模式
  10. 按顺序插入图片_MysqlInnodb特性之插入缓存
  11. git安装和GitHub使用
  12. Teamcenter(Enterprise 2007) 开发之- 快速搭建开发环境(windows)
  13. linux jar管理工具,常用的linux下jar包管理命令
  14. linux raid
  15. JAVAEE框架架构高级视频教程
  16. 计算机未来的发展英语作文,关于科技发展英语作文(通用10篇)
  17. 计算机科学理论数学研讨会,2017年奇异摄动理论及其应用学术研讨会会议-上海交通大学数学系.DOC...
  18. 【历史上的今天】1946年2月14日:世界上第一台计算机ENIAC诞生
  19. 【洛谷】3957 跳房子
  20. 木纹标识lisp_AutoLisp学习笔记:变量类型

热门文章

  1. node.js使用fs模块的renameSync方法报错“ EXDEV: cross-device link not permitted, rename ‘F‘ -> ‘G“
  2. Linux命令(入门)-----DV
  3. Plant Simulation新版本2201测试记录
  4. Java内部类详解(含:成员内部类、局部内部类、匿名内部类、静态内部类)
  5. 抓包就明白CoreDNS域名解析
  6. 给定一棵二叉树,判断它是否是镜像对称的
  7. python中elasticsearch_dsl模块用法详解
  8. G.O.A.T!最靠谱的Mirai僵尸病毒编译教程
  9. tensorflow中Relu激活函数
  10. delphi mysql 图片_Delphi实现在数据库中存取图像