Apex - 触发器



Apex触发器类似于存储过程,在特定事件发生时执行。触发器在记录上发生事件之前和之后执行。

语法

trigger triggerName on ObjectName (trigger_events) { Trigger_code_block }

执行触发器

以下是我们可以触发触发器的事件:

  • 插入
  • 更新
  • 删除
  • 合并
  • Upsert
  • 取消删除

触发器示例1

假设我们收到一个业务需求,需要在客户的“客户状态”字段从“非活动”更改为“活动”时创建一个发票记录。为此,我们将按照以下步骤在APEX_Customer__c对象上创建一个触发器:

步骤1 - 转到sObject

步骤2 - 点击客户

步骤3 - 点击触发器相关列表中的“新建”按钮,并添加如下所示的触发器代码。

// Trigger Code
trigger Customer_After_Insert on APEX_Customer__c (after update) {
   List InvoiceList = new List();
   
   for (APEX_Customer__c objCustomer: Trigger.new) {
      
      if (objCustomer.APEX_Customer_Status__c == 'Active') {
         APEX_Invoice__c objInvoice = new APEX_Invoice__c();
         objInvoice.APEX_Status__c = 'Pending';
         InvoiceList.add(objInvoice);
      }
   }
   
   // DML to insert the Invoice List in SFDC
   insert InvoiceList;
}

说明

Trigger.new - 这是一个上下文变量,它存储当前在触发器上下文中的记录,无论是插入还是更新。在本例中,此变量包含已更新的客户对象的记录。

上下文中还有其他可用的上下文变量 – trigger.old、trigger.newMap、trigger.OldMap。

触发器示例2

当对客户记录进行更新操作时,上述触发器将执行。假设,只有当客户状态从“非活动”更改为“活动”时才需要插入发票记录,而不是每次都插入;为此,我们可以使用另一个上下文变量trigger.oldMap,它将存储键作为记录 ID,并将值作为旧记录值。

// Modified Trigger Code
trigger Customer_After_Insert on APEX_Customer__c (after update) {
   List<apex_invoice__c> InvoiceList = new List<apex_invoice__c>();
   
   for (APEX_Customer__c objCustomer: Trigger.new) {
      
      // condition to check the old value and new value
      if (objCustomer.APEX_Customer_Status__c == 'Active' &&
      
      trigger.oldMap.get(objCustomer.id).APEX_Customer_Status__c == 'Inactive') {
         APEX_Invoice__c objInvoice = new APEX_Invoice__c();
         objInvoice.APEX_Status__c = 'Pending';
         InvoiceList.add(objInvoice);
      }
   }
   
   // DML to insert the Invoice List in SFDC
   insert InvoiceList;
}

说明

我们使用了Trigger.oldMap变量,如前所述,这是一个上下文变量,它存储正在更新的记录的ID和旧值。

广告