This topic came up again today in reference to a trigger to modify lead assignments. It's always important to keep the order of these events in mind when developing as it can cause unintended consequences and a debugging nightmare.
When a record is saved with an insert, update, or upsert statement, the following events occur in order:
- The original record is loaded from the database (or initialized for an insert statement)
- The new record field values are loaded from the request and overwrite the old values
- System validation occurs, such as verifying that all required fields have a non-null value, and running any user-defined validation rules
- All before triggers execute
- The record is saved to the database, but not yet committed
- All after triggers execute
- Assignment rules execute
- Auto-response rules execute
- Workflow rules execute
- If there are workflow field updates, the record is updated again
- If the record was updated with workflow field updates, before and after triggers fire one more time (and only one more time)
- Escalation rules execute
- All DML operations are committed to the database
- Post-commit logic executes, such as sending email