When we should use Trigger.Old

Understanding Trigger.Old in Salesforce Apex Triggers

Trigger.Old is a context variable available in Salesforce Apex triggers. It provides a read-only list of the original versions of sObject records before they were changed by a DML operation. Knowing when and how to use Trigger.Old is essential for building robust, data-consistent triggers.

When to use Trigger.Old

Use Trigger.Old in these scenarios:

  • Before Update or After Update triggers: When you need to compare old and new values to detect changes. For example, tracking field changes, enforcing business rules triggered by specific field updates, or auditing.
  • Before Delete or After Delete triggers: To access the record values that are being deleted (since the current record is no longer available after deletion).
  • Cascading updates or related record handling: When changes to one record require updates to related records, comparing old and new values helps determine if related updates are necessary.
  • Preventing or allowing processing based on changes: Use Trigger.Old to check whether a particular field’s value changed and then decide whether to proceed with additional processing.

Examples

1) Detecting a field change in a Before Update trigger:

for (Integer i = 0; i < Trigger.new.size(); i++) { Account newAcc = (Account)Trigger.new[i]; Account oldAcc = (Account)Trigger.old[i]; if (newAcc.AnnualRevenue != oldAcc.AnnualRevenue) { // Handle revenue change logic } }

2) Using Trigger.Old in a Before Delete trigger to archive values:

for (Account acc : Trigger.old) {
// Copy values to a custom archive object before deletion
Account_Archive__c arch = new Account_Archive__c();
arch.Name__c = acc.Name;
arch.Revenue__c = acc.AnnualRevenue;
inserts.add(arch);
}

Important considerations

  • Trigger.Old is only available in update and delete contexts — it is not available in insert triggers.
  • The lists Trigger.new and Trigger.old correspond by index, so use the same index when comparing records.
  • Trigger.Old is read-only. To change data, modify Trigger.new records (for before triggers) or perform DML operations on other sObjects.
  • Watch for bulk operations — always write triggers that handle collections efficiently to avoid governor limits.

Best practices

  • Use Maps keyed by Id when comparing related records to improve performance in bulk operations.
  • Keep trigger logic minimal by delegating complex processing to handler classes.
  • Avoid SOQL or DML inside loops — bulkify your code.
  • Write unit tests that simulate update and delete contexts to verify Trigger.Old behavior.

Using Trigger.Old correctly helps you build predictable, maintainable Apex triggers that respond accurately to record changes.