Salesforce Trigger – Complete Beginner Friendly Guide
This tutorial demonstrates all types of Salesforce Triggers using a simple custom object example.
Assumptions
- Custom Object: Branch__c
- Field: Branch_Name__c (Text)
1. Basic Trigger Syntax
A trigger runs automatically when a record is inserted, updated, deleted, or restored.
trigger BranchTrigger on Branch__c (
before insert, before update,
after insert, after update,
before delete, after delete,
after undelete
) {
// Trigger logic
}
Key Points:
- Trigger.new → New records
- Trigger.old → Old records
- Trigger.oldMap → Old record values by Id
2. BEFORE INSERT Trigger
Use Case: Format Branch Name before saving.
trigger BranchBeforeInsert on Branch__c (before insert) {
for (Branch__c b : Trigger.new) {
if (b.Branch_Name__c != null) {
b.Branch_Name__c = b.Branch_Name__c.toUpperCase();
}
}
}
Explanation:
- Runs before record is saved
- No DML required
- Best for validation and formatting
3. BEFORE UPDATE Trigger
Use Case: Do not allow Branch Name change.
trigger BranchBeforeUpdate on Branch__c (before update) {
for (Branch__c b : Trigger.new) {
Branch__c oldB = Trigger.oldMap.get(b.Id);
if (b.Branch_Name__c != oldB.Branch_Name__c) {
b.addError('Branch Name cannot be changed');
}
}
}
Explanation:
- Uses Trigger.oldMap to compare values
- addError() stops record update
4. AFTER INSERT Trigger
Use Case: Modify record after it is saved.
trigger AfterInsertBranchTrigger on BranchMaster__c (after insert) {
List<BranchMaster__c> branchList = [
SELECT Id, Name
FROM BranchMaster__c
WHERE Id IN :Trigger.new
];
for (BranchMaster__c b : branchList) {
if (b.Name != null && !b.Name.endsWith(' - INDIA')) {
b.Name = b.Name + ' - INDIA';
}
}
if (!branchList.isEmpty()) {
update branchList;
}
}
Explanation:
- Record already saved
- DML operation is required
5. AFTER UPDATE Trigger
Use Case: Track Branch Name changes.
trigger BranchAfterUpdate on Branch__c (after update) {
for (Branch__c b : Trigger.new) {
Branch__c oldB = Trigger.oldMap.get(b.Id);
if (b.Branch_Name__c != oldB.Branch_Name__c) {
System.debug(
'Branch Name changed from ' +
oldB.Branch_Name__c +
' to ' +
b.Branch_Name__c
);
}
}
}
Explanation:
- Used for logging, notifications, integrations
6. BEFORE DELETE Trigger
Use Case: Restrict deletion of important records.
trigger BranchBeforeDelete on Branch__c (before delete) {
for (Branch__c b : Trigger.old) {
if (b.Branch_Name__c == 'HEAD OFFICE') {
b.addError('Head Office branch cannot be deleted');
}
}
}
Explanation:
- Uses Trigger.old
- addError() prevents deletion
7. AFTER DELETE Trigger
Use Case: Log deleted records.
trigger BranchAfterDelete on Branch__c (after delete) {
for (Branch__c b : Trigger.old) {
System.debug('Deleted Branch: ' + b.Branch_Name__c);
}
}
Explanation:
- Record already deleted
- Useful for audit purposes
Real-time example of trigger create branch backup table and it will store the record before update and before delete record and after insert
8. AFTER UNDELETE Trigger
Use Case: Handle record restore from Recycle Bin.
trigger BranchAfterUndelete on Branch__c (after undelete) {
List<Branch__c> branches = new List<Branch__c>();
for (Branch__c b : Trigger.new) {
b.Branch_Name__c = 'RESTORED - ' + b.Branch_Name__c;
branches.add(b);
}
update branches;
}
Explanation:
- Runs when record is restored
- Used for audit and notifications
9. Best Practice (Very Important)
Rule: Always create one trigger per object.
trigger BranchTrigger on Branch__c (
before insert, before update,
after insert, after update,
before delete, after delete,
after undelete
) {
if (Trigger.isBefore && Trigger.isInsert) {
// before insert logic
}
}
10. Trigger Types Summary
| Trigger Type | When It Runs | Use Case |
|---|---|---|
| Before Insert | Before save | Validation, formatting |
| After Insert | After save | Updates, notifications |
| Before Update | Before change | Validation |
| After Update | After change | Logging |
| Before Delete | Before delete | Restrict deletion |
| After Delete | After delete | Audit |
| After Undelete | After restore | Notification |
Conclusion:
Triggers are powerful tools in Salesforce to control data and automate processes.
Always follow best practices and write clean, bulkified code.
0 Comments
POST Answer of Questions and ASK to Doubt