apex的触发器是怎么使用的?
作者:互联网
Apex 触发器是 Salesforce 中用于在特定对象的记录插入、更新或删除时自动执行逻辑的代码。触发器可以非常强大,但也需要谨慎使用以确保性能和数据完整性。
Apex 触发器的基本结构
一个典型的 Apex 触发器包括以下元素:
- 触发器名称:触发器的唯一标识符。
- 触发对象:触发器所关联的对象(例如
Account
、Contact
等)。 - 触发事件:触发器何时执行(
before insert
、after insert
、before update
、after update
、before delete
、after delete
)。 - 触发逻辑:触发器中包含的业务逻辑。
触发器示例
示例 1:确保 ShippingState
和 BillingState
一致
假设我们有一个需求,在插入或更新 Account
记录时,确保 ShippingState
字段与 BillingState
字段保持一致。我们可以创建一个触发器来实现这一逻辑。
trigger AccountTrigger on Account (before insert, before update) {
// Iterate over each record in Trigger.new
for (Account acc : Trigger.new) {
// Ensure ShippingState matches BillingState
if (acc.BillingState != null) {
acc.ShippingState = acc.BillingState;
} else {
// Optionally handle cases where BillingState is null
acc.ShippingState = null;
}
}
}
Apex
示例 2:在创建新 Contact
时自动设置 AccountId
假设我们在创建新的 Contact
时,需要根据某些条件自动设置 AccountId
字段。这里我们使用一个自定义字段 DefaultAccountId__c
来存储默认的 AccountId
。
trigger ContactTrigger on Contact (before insert) {
// Get the default Account Id from a custom setting or configuration
Id defaultAccountId = [SELECT Id FROM Account WHERE Name = 'Default Account' LIMIT 1].Id;
// Iterate over each new Contact record
for (Contact con : Trigger.new) {
// If AccountId is not set, assign the default Account Id
if (con.AccountId == null) {
con.AccountId = defaultAccountId;
}
}
}
Apex
示例 3:在删除 Opportunity
时检查相关 OpportunityLineItem
假设我们需要在删除 Opportunity
时检查是否有相关的 OpportunityLineItem
存在,并阻止删除操作。
trigger OpportunityTrigger on Opportunity (before delete) {
// Collect the IDs of the Opportunities being deleted
Set<Id> opportunityIds = new Set<Id>();
for (Opportunity opp : Trigger.old) {
opportunityIds.add(opp.Id);
}
// Query related OpportunityLineItems
List<OpportunityLineItem> lineItems = [
SELECT Id, OpportunityId
FROM OpportunityLineItem
WHERE OpportunityId IN :opportunityIds
];
// If there are any related line items, prevent deletion
if (!lineItems.isEmpty()) {
for (Opportunity opp : Trigger.old) {
opp.addError('Cannot delete this Opportunity because it has related Opportunity Line Items.');
}
}
}
Apex
触发器的最佳实践
-
避免直接在触发器中编写复杂逻辑: 将业务逻辑移到单独的类中,使触发器保持简洁和可维护性。例如:
trigger AccountTrigger on Account (before insert, before update) { AccountTriggerHandler.handleAccounts(Trigger.new); }
Apexpublic class AccountTriggerHandler { public static void handleAccounts(List<Account> accounts) { for (Account acc : accounts) { if (acc.BillingState != null) { acc.ShippingState = acc.BillingState; } else { acc.ShippingState = null; } } } }
Apex -
批量处理: 触发器中的逻辑应能处理批量操作(即一次处理多个记录)。避免在循环中进行 SOQL 查询或 DML 操作,以防止 governor limits 超限。
-
使用
Trigger.old
和Trigger.new
:Trigger.new
包含正在插入或更新的记录。Trigger.old
包含正在更新或删除的记录的原始值。
-
测试覆盖率: 确保为触发器编写单元测试,以验证其行为并确保足够的测试覆盖率。
标签: 来源: