千家信息网

Salesforce的Trigger触发器怎么使用

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,今天小编给大家分享一下Salesforce的Trigger触发器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有
千家信息网最后更新 2026年10月31日Salesforce的Trigger触发器怎么使用

今天小编给大家分享一下Salesforce的Trigger触发器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一 . Apex Trigger 触发器

Apex 触发器(Apex Triggers)是一种特殊的 Apex 类。 Apex触发器类似于当特定事件发生时执行的存储过程。 它在记录事件发生之前和之后执行。 它的主要作用是在一条记录被插入、修改、删除之前或之后自动执行一系列的操作。每一个 Trigger 类必须对应一种对象。

Trigger 的语法和普通的 Apex 类一样。

Salesforce 建议开发者在创建 Trigger 之前,考虑一下相同的操作可否通过 Salesforce 的设置界面中的功能完成,比如验证规则(Validation Rule)、工作流规则(Workflow Rule)等。如果可以,则优先使用它们。

二 . Apex Trigger 的结构 和 触发事件

语法结构 :

 //语法结构trigger triggerName on ObjectName (trigger_events) { Trigger_code_block } // 说明trigger Trigger名字(触发器名字)  on  对象名字 (触发事件) { //Do something }

Trigger 类必须以关键字 "trigger" 开始,然后是此 Trigger 的名字。接下来是 "on" 关键字,然后是 Trigger 对应的对象的名字。对象名字后面的括号中写入触发 Trigger 的事件。

Trigger触发 的事件分为以下几种 :

  • insert //添加

  • update //修改

  • delete //删除

  • merge //合并

  • upsert //添加或修改 ,即 无该条数据 就添加 有这条数据则修改

upsert原理:upsert通过是否存在此ID来判断此条记录是否存在,1.如果不存在此ID则执行insert操作;2.如果存在并且只存在一个ID,则执行update操作;3.存在并且存在多个ID,则抛出DMLException
  • undelete //取消删除 , 可以取消删除已删除并存在于回收站中的记录

Trigger触发 的类型分为以下几种 :

  • Before trigger 通常用于在他们被保存在数据库以前更新或者校验数据;

  • After trigger 通常用于保存后访问系统的字段(Id等).

小喵把它们理解为前置触发器和后置触发器,即 在 触发事件之前 和 触发事件之后 干什么.(这只是小喵的个人理解,只是为了方便了解/学习)

三 . 设计思想

Trigger设计思想为 'One Trigger per Object ' 即 ' 一个对象 一个触发器 ' , 我们 可以将特定对象的所有可能触发的触发器组合成一个触发器.

注意:trigger代码块中不能包含static关键字。

这种设计模式的好处 :

❃ 可重用性 : 将逻辑放在一个类中,现在可以在触发器之外重用它,例如在Visualforce页面,测试类,批处理Apex等中。无需复制代码!

❃ 简便性 : 在主触发器中,每个"触发器"都减少为仅两行代码。一个面向对象的代码库更加有组织的,可预见的和模块化的呢!

❃ 控制执行顺序 : 在Apex中,"不能保证同一对象上的多个触发器的执行顺序。" 这种模式使您可以全面控制订单。

❃ 代码风格 : 无论是否利用了上述任何优势,都将看起来像使用此模式的Apex主服务器。

四 . 常用变量

Trigger类中封装了很多的上下文的变量,这些变量在开发中经常用到。

  • isExecuting:当前Apex代码的上下文环境为trigger环境,而不是VF等则返回true,否则返回false;

  • isInsert:当前操作是否为正在执行添加操作,是返回true,否则返回false;

  • isUpdate:当前操作是否为正在执行修改操作,是返回true,否则返回false;

  • isDelete:当前操作是否为正在执行删除操作,是返回true,否则返回false;

  • isBefore:当前操作是否为在save以前操作,是返回true,否则返回false;

  • isAfter:当前操作是否为在save以后操作,是返回true,否则返回false;

  • isUndelete:当前操作是否为在回收箱中回复数据以后操作,是返回true,否则返回false;

注意 : 以上布尔类型的变量 , 用于 标志 Trigger 或数据的状态 .

  • new:返回sObject的记录的最新的数据的列表;

  • newMap:返回一个ID映射到最新的数据列表的Map集合;

  • old:返回sObject的记录修改以前的数据的列表;

  • oldMap:返回一个ID映射到修改以前的数据列表的Map集合;

  • size:在触发器中调用的数据总数,包括new和old。

其中, new , new Map , old , oldMap 是有使用限制的,需要重点说明一下 :

  • new只适用于执行insert和update的trigger操作时并且类型为before的时候,才可以使用new返回列表;

  • newMap只适用于before update,after insert以及after update的trigger操作时,才可以使用newMap返回map集合;

  • old以及oldMap只适用于update和delete操作时,才可以使用old以及oldMap。

简单来说 , Trigger.New 和 Trigger.Old 是两个预定义变量 , 可以用于每一个Trigger类中 . 前者代表了即将被插入、更新的数据 , 后者代表了更新之前、删除之前的数据 . 它们可能包含一条数据 , 也可能包含一组数据,取决于触发Trigger 时的状态 .

注意 : Trigger.New 不存在于 delete 操作中 , 因为 删除之后就没有数据了 ; 而 Trigger.Old 不存在 insert 操作 , 因为 插入数据之前是没有数据的.

五 . Trigger 触发器的使用

目前小喵使用trigger主要有两种方式 : 第一种是 直接使用trigger , 在trigger内部块中写业务逻辑 ; 第二种是 通过Handler 对 trigger 进行封装 .

1) 直接在Trigger内部块中写代码 :

trigger AccountBeforeDelete on Account (before delete) {    if (Trigger.isBefore) {        // 在SFDelete c中追加数据        if (Trigger.isDelete) {            List dlist = new List();            for (Account a : Trigger.old) {                dlist.add(new SFDelete__c(                    delSfId__c = a.Id,                    tableName__c = 'Account',                    dataOwnerId__c = a.OwnerId                ));            }            ControllerUtil.insSFDelete(dlist);        }    }}

2) 通过Handler 对 trigger 进行封装 :

通过Handler方式可以将每个Object创建其自身的Handler,将trigger业务逻辑写在自身的Handler里面,并通过Factory实例化,达到更好的可扩展性以及可读性 .

2.1) 创建 TriggerHandler 父类

public abstract class TriggerHandler {    /*        Trigger中,在运行时封装了new,newMap,old,oldMap变量        其中,new和old返回类型为List        newMap和oldMap返回类型为Map    */    protected Map oldMap{get;set;}    protected Map newMap{get;set;}    protected List listNew{get;set;}    protected List listOld{get;set;}    /*        封装trigger应该注意以下几点:        1.trigger.new只能用在insert和update时,且trigger必须是before;        2.trigger.old只能用在update和delete时;        3.trigger.newMap只能用在before update,after insert和after update时;        4.trigger.oldMap只能用在update和delete时.    */    public interface MyTrigger {        void beforeInsert(SObject currentObject);        void beforeUpdate(SObject oldSobject, SObject currentObject);        void beforeDelete(SObject currentObject);        void afterInsert(SObject currentObject);        void afterUpdate(SObject oldSobject, SObject currentObject);        void afterDelete(SObject currentObject);        Boolean skipExecution();  }}

2.2) 创建相关对象的Handler , 继承TriggerHandler 并实现其MyTrigger接口 , 并实现相关方法 .

public class GoodsHandler extends TriggerHandler implements TriggerHandler.MyTrigger {    public GoodsHandler() {        // TODO Construcion    }    public void beforeInsert(SObject currentObject) {        // TODO beforeInsert    }    public void afterInsert(SObject currentObject) {        // TODO afterInsert    }    public void beforeUpdate(SObject oldSobject, SObject currentObject) {        // TODO beforeUpdate    }    public void beforeDelete(SObject currentObject) {        //TODO beforeDelete    }    public void afterUpdate(SObject oldSobject, SObject currentObject) {    }    public void afterDelete(SObject currentObject) {    }    public Boolean skipExecution() {        return false;    }}

2.3) 创建TriggerFactory,此方法用于实例化Trigger的Handler并执行相应的before或者after操作,其中MyException为自定义异常类。

public class MyException extends Exception {}
public class TriggerFactory {    /*        实例化Handler,如果不跳过executeTrigger情况下,自动执行Trigger    */    public static void instanceHandler(Schema.SObjectType objectToken) {        TriggerHandler.MyTrigger myTriggerHandler = getTriggerByObjectToken(objectToken);        if(myTriggerHandler == null) {            throw new MyException('无此object token的trigger');        }        if(!myTriggerHandler.skipExecution()) {            executeTrigger(myTriggerHandler);        }    }    /*        执行trigger应该注意以下几点:        1.trigger.new只能用在insert和update时,且trigger必须是before;        2.trigger.old只能用在update和delete时;        3.trigger.newMap只能用在before update,after insert和after update时;        4.trigger.oldMap只能用在update和delete时.    */    public static void executeTrigger(TriggerHandler.MyTrigger myTriggerHandler) {        //trigger分成isBefore以及isAfter        if(Trigger.isBefore) {            if(Trigger.isInsert) {                for (SObject currentObject : Trigger.new)                {                    myTriggerHandler.beforeInsert(currentObject);                }            }else if(Trigger.isUpdate) {                for (SObject oldObject : Trigger.old)                {                    myTriggerHandler.beforeUpdate(oldObject, Trigger.newMap.get(oldObject.Id));                }            }else if(Trigger.isDelete) {                for (SObject currentObject : Trigger.old)                {                    myTriggerHandler.beforeDelete(currentObject);                }            }        } else {//isAfter             if (Trigger.isInsert) {                for (SObject currentObject : Trigger.new) {                    myTriggerHandler.afterInsert(currentObject);                }             } else if (Trigger.isUpdate) {                for (SObject oldObject : Trigger.old) {                    myTriggerHandler.afterUpdate(oldObject, Trigger.newMap.get(oldObject.Id));                }             } else if (Trigger.isDelete){                for (SObject currentObject : Trigger.old) {                    myTriggerHandler.afterDelete(currentObject);                }             }        }    }    /*        此方法用于返回具体某个object的trigger,如果添加一个object的trigger,在此方法添加相应的匹配处理,        同时此object的Handler必须继承TriggerHandler以及实现TriggerHandler.MyTrigger        每个Object的Object Token不同,所以使用Token作为参数更加便捷    */    public static TriggerHandler.MyTrigger getTriggerByObjectToken(Schema.SObjectType objectToken) {        if(objectToken == Goods__c.sObjectType) {            return new GoodsHandler();        }        // TODO  有其他Object需要使用trigger可以继承TriggerHandler实现其中MyTrigger然后在此处配置        return null;    }}

2.4) 相应Object的trigger调用Factory的实例化方法

trigger GoodsTrigger on Goods__c (before delete, before update) {          TriggerFactory.instanceHandler(Goods__c.sObjectType);}

当Goods__c字段进行delete或者update操作时,save以前,会自动触发GoodsTrigger,GoodsTrigger会执行TriggerFactory的instanceHandler方法,此方法会调用执行instanceHandler以及executeTrigger函数,从而最终将Goods__c表trigger业务逻辑由GoodsHandler类处理。

提示 : 如果业务相对简单,可以采用第一种方式,开发效率高;如果业务相对复杂,第二种方式可以在相应的Handler模块更加明了的书写业务逻辑,方便后期维护以及有更好的可读性

以上就是"Salesforce的Trigger触发器怎么使用"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

数据 触发器 对象 事件 代码 业务 变量 名字 逻辑 类型 封装 实例 方式 此方法 知识 篇文章 更新 关键 关键字 方法 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡网 手磨咖啡 百单网互联网科技有限公司怎么样 西安纸贵互联网科技有限公司 中关村互联网 科技集团 江苏根荣互联网科技 合肥互联网科技公司 鑫亿盛互联网科技 齐家互联网科技有限公司 互联网科技大会 互联网科技股午盘股票涨跌 中国最先进互联网科技公司 广州恒生互联网科技有限 中国互联网十大科技股排名 科技赋能视角下互联网保险发展 宁波跨境商互联网科技有限公司 云南互联网科技学费 张家口科技产业互联网平台 山东亿川互联网科技有限责任公司 株洲百竞科技的互联网营销顾问 融势互联网科技 互联网科技logo设计 互联网科技汛 江苏南京365互联网科技 中国的互联网科技企业的崛起 剑昆互联网络科技有限公司临桂 本届互联网博览会上的黑科技 求路客互联网科技电话 承德科技产业互联网平台 互联网科技创新方面的资料
0