**Source URL:** https://general.veevavault.dev/vault-sdk/entry-points/triggers/data-availability.md

# Data Availability



When processing a request, the System performs the following sequence of steps:

1. Evaluative field dependencies: [Field dependencies](https://platform.veevavault.help/en/gr/2617) are UI-only and are validated before triggers are fired. If Vault Java SDK then changes data, field dependencies are not re-evaluated.

2. Execute `BEFORE` [Action Triggers](https://platform.veevavault.help/en/gr/811001).

3. Execute `BEFORE` triggers.

4. Write record changes to database.

5. Update changes in VQL index.

6. Execute `AFTER` [Action Triggers](https://platform.veevavault.help/en/gr/811001).

7. Execute `AFTER` triggers.

The data available in `BEFORE` and `AFTER` event triggers depends on the operations (`INSERT`, `UPDATE`, and `DELETE`). For example, in an `INSERT` operation, you cannot get old or existing values because a new record is being inserted. Similarly, setting a field value only makes sense in the `BEFORE` event in `INSERT` and `UPDATE` operations. It doesn't make sense to set field ​value after it has been persisted or in a `DELETE` operation. The following chart illustrates when you can get or set field values.

<table style="table-layout:fixed;border-collapse:collapse;width:100%;font-family:sans-serif;background-color:transparent"><colgroup><col style="width:15%"/><col style="width:21.25%"/><col style="width:21.25%"/><col style="width:21.25%"/><col style="width:21.25%"/></colgroup><thead><tr><th style="padding:0;border:none"></th><th colSpan="2" style="background-color:#aaaaaa;padding:15px;text-align:center;border-right:4px solid transparent;border-left:none;border-top:none;border-bottom:none;background-clip:padding-box"><span style="color:white;mix-blend-mode:screen;font-weight:bold;font-size:1.2em">getNew()</span></th><th colSpan="2" style="background-color:#aaaaaa;padding:15px;text-align:center;border:none;border-top:none;border-left:none;border-bottom:none;background-clip:padding-box"><span style="color:white;mix-blend-mode:screen;font-weight:bold;font-size:1.2em">getOld()</span></th></tr><tr><td style="border:none"></td><td style="background-color:#cccccc;padding:10px;text-align:center;border:1px solid transparent;border-left:none;border-top:none;border-bottom:4px solid transparent;background-clip:padding-box"><span style="color:white;mix-blend-mode:screen;font-weight:bold;font-size:16px">getValue</span></td><td style="background-color:#cccccc;padding:10px;text-align:center;border:1px solid transparent;border-top:none;border-left:none;border-right:4px solid transparent;border-bottom:4px solid transparent;background-clip:padding-box"><span style="color:white;mix-blend-mode:screen;font-weight:bold;font-size:16px">setValue</span></td><td style="background-color:#cccccc;padding:10px;text-align:center;border:1px solid transparent;border-top:none;border-left:none;border-bottom:4px solid transparent;background-clip:padding-box"><span style="color:white;mix-blend-mode:screen;font-weight:bold;font-size:16px">getValue</span></td><td style="background-color:#cccccc;padding:10px;text-align:center;border:1px solid transparent;border-top:none;border-left:none;border-bottom:4px solid transparent;background-clip:padding-box"><span style="color:white;mix-blend-mode:screen;font-weight:bold;font-size:16px">setValue</span></td></tr></thead><tbody><tr><td style="padding:12px 10px;font-weight:bold;text-align:right;font-size:16px;color:inherit;border:none">BEFORE_INSERT</td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:none;border-right:1px solid transparent;background-clip:padding-box"><span style="color:#5cb85c;font-size:1.8em">✓</span></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:4px solid transparent;background-clip:padding-box"><span style="color:#5cb85c;font-size:1.8em">✓</span></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:1px solid transparent;background-clip:padding-box"></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:1px solid transparent;background-clip:padding-box"></td></tr><tr><td style="padding:12px 10px;font-weight:bold;text-align:right;font-size:16px;color:inherit;border:none">AFTER_INSERT</td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:none;border-right:1px solid transparent;background-clip:padding-box"><span style="color:#5cb85c;font-size:1.8em">✓</span></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:4px solid transparent;background-clip:padding-box"></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:1px solid transparent;background-clip:padding-box"></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:1px solid transparent;background-clip:padding-box"></td></tr><tr><td style="padding:12px 10px;font-weight:bold;text-align:right;font-size:16px;color:inherit;border:none">BEFORE_UPDATE</td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:none;border-right:1px solid transparent;background-clip:padding-box"><span style="color:#5cb85c;font-size:1.8em">✓</span></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:4px solid transparent;background-clip:padding-box"><span style="color:#5cb85c;font-size:1.8em">✓</span></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:1px solid transparent;background-clip:padding-box"><span style="color:#5cb85c;font-size:1.8em">✓</span></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:1px solid transparent;background-clip:padding-box"></td></tr><tr><td style="padding:12px 10px;font-weight:bold;text-align:right;font-size:16px;color:inherit;border:none">AFTER_UPDATE</td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:none;border-right:1px solid transparent;background-clip:padding-box"><span style="color:#5cb85c;font-size:1.8em">✓</span></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:4px solid transparent;background-clip:padding-box"></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:1px solid transparent;background-clip:padding-box"><span style="color:#5cb85c;font-size:1.8em">✓</span></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:1px solid transparent;background-clip:padding-box"></td></tr><tr><td style="padding:12px 10px;font-weight:bold;text-align:right;font-size:16px;color:inherit;border:none">BEFORE_DELETE</td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:none;border-right:1px solid transparent;background-clip:padding-box"></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:4px solid transparent;background-clip:padding-box"></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:1px solid transparent;background-clip:padding-box"><span style="color:#5cb85c;font-size:1.8em">✓</span></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:1px solid transparent;background-clip:padding-box"></td></tr><tr><td style="padding:12px 10px;font-weight:bold;text-align:right;font-size:16px;color:inherit;border:none">AFTER_DELETE</td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:none;border-right:1px solid transparent;background-clip:padding-box"></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:4px solid transparent;background-clip:padding-box"></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:1px solid transparent;background-clip:padding-box"><span style="color:#5cb85c;font-size:1.8em">✓</span></td><td style="background-color:#f5f5f5;text-align:center;padding:12px;border:1px solid transparent;border-left:1px solid transparent;border-right:1px solid transparent;background-clip:padding-box"></td></tr></tbody></table>

### Query vs RecordService#readRecord {#query-vs-recordservicereadrecord}

As illustrated above, `BEFORE` triggers can change field values, but these values are not persisted to the database and not updated in the VQL index yet. In this case, using the `QueryService` to retrieve a record being modified by a trigger will only return the old (existing) values. In order to get the values set by a trigger inside a transaction, you must use the `RecordService#readRecord` method. However, this method generally uses more memory. It is only recommended when you need to get field values modified by multiple triggers in a single transaction. Otherwise, we recommend `QueryService` to retrieve record data.

Because `AFTER` triggers happen after database updates and VQL indexing, you can use `QueryService` to retrieve both old and new values.

## System Populated Fields {#system-populated-fields}

Certain field types in Vault have values set by the System. For example:

* [Lookup Fields](https://platform.veevavault.help/en/gr/34072) are read-only fields that the System populates with the "Lookup Source Field" value.

* [Document Reference Fields](https://platform.veevavault.help/en/gr/35045) have two fields (bound and unbound), and when configured to reference the "Latest Version", the bound field becomes read-only, and the System populates it with the latest document version value.

In general, the System populates field values after the `BEFORE` event. Because these field values are set by the System, the changes are not reflected in the `BEFORE` event. For example, `getNew()` and `getOld()` will return the same existing value or null accordingly. However, the `AFTER` event will return the new value set by the System in `getNew()` and the existing value in `getOld()`. For example, when creating a new document, documents using document auto-naming will have a null value for name in `BEFORE_INSERT` events.

In addition, because System-initiated requests do not fire triggers, triggers will not fire when the System updates a System-populated field.

If your trigger updates a document reference field, you must set the *Document Version Reference* to *Specific Version*. Learn more in [Vault Help](https://platform.veevavault.help/en/gr/35045).



---

**Previous:** [Execution Flow](/vault-sdk/entry-points/triggers/execution-flow)  
**Next:** [Performance Considerations](/vault-sdk/entry-points/triggers/performance-considerations)