[SalesForce] Account Merge – Opportunity is not updated / touched

Could someone who knows better verify:

I just tested and it seems to me that if I merge –

  • Account 1 with 2 opps (destination)
  • Account 2 with 3 opps

…that the resultant Account 1 with all five opps does NOT benefit from having the Opps it obtained actually being "touched" (updated, edit/save, etc) officially (so no triggers/etc run). Is this true?

Is there a simple way to make this happen, perhaps a simple trigger that would say "if I detect my AccountID has changed, touch me" (at the Opp level)? Since it's not doing it by default, I am unclear how to code such a thing if SF itself doesn't even recognize that the Opp record has been updated (AccountID reference has changed after Merge).

Thanks!

Best Answer

From the Apex Developer's Guide:

Merge events do not fire their own trigger events. Instead, they fire delete and update events as follows:

Deletion of losing records A single merge operation fires a single delete event for all records that are deleted in the merge. To determine which records were deleted as a result of a merge operation use the MasterRecordId field in Trigger.old. When a record is deleted after losing a merge operation, its MasterRecordId field is set to the ID of the winning record. The MasterRecordId field is only set in after delete trigger events. If your application requires special handling for deleted records that occur as a result of a merge, you need to use the after delete trigger event.

Update of the winning record A single merge operation fires a single update event for the winning record only. Any child records that are reparented as a result of the merge operation do not fire triggers. For example, if two contacts are merged, only the delete and update contact triggers fire. No triggers for records related to the contacts, such as accounts or opportunities, fire.

The following is the order of events when a merge occurs:

  1. The before delete trigger fires.

  2. The system deletes the necessary records due to the merge, assigns new parent records to the child records, and sets the MasterRecordId field on the deleted records. ) 

  3. The after delete trigger fires.

  4. The system does the specific updates required for the master record. Normal update triggers apply.

Thus you could have a before delete trigger on the deletion of the losing records and figure out the children that will be affected. I suspect that you might need to have some co-ordination between the before and after delete triggers, such that the before figured out the affected children of a delete, and the after confirmed that they were being deleted as part of a merge and took appropriate action.