Sometimes deleting some parts of the data history is intended, e.g. if there are semantic errors in the data that you don't like to see being reproduced when restored. In order to apply corrections against the complete audit trail there are two options: Deleting or updating a key hence a column.

Delete a key from the row_log

Call pgmemento.delete_key and pass the audit_id, column name and old value (any type). This removes the given key-value pair from the JSONB logs. The subsequent value will then also cover the life time of the old value. Keep in mind that this action can also produce emtpy logs in the row_log table.

sql SELECT pgmemento.delete_key(555, 'column_B', 'old_value'::text);

The audit trail in the new_data column of the row_log table is also covered by the delete_key function. If you delete a key-value pair from a DELETE event log, it will also be removed from the new_data log where the value has been introduced. If you delete a key from an UPDATE event log, it will also be removed from the new_data log of the same event as if the column wasn't updated during that transaction. The new value for the given key then replaces the old one (you have just removed from the old_data log) in the new_data log, where it has been introduced.

Before: | old_data | new_data | | ------------------------- | -------------------------- | | ... | ... | | {"column_B": "ancient"} | {"column_B": "old_value"} | | ... | ... | | {"column_B": "ancient"} | {"column_B": "new_value"} |

After: | old_data | new_data | | ------------------------- | -------------------------- | | ... | ... | | {"column_B": "ancient"} | {"column_B": "new_value"} | | ... | ... | | {} | {} |

As you can see in this example, deleting a key from the row_log with pgmemento.delete_key can produce an empty JSONB. This can have a negative side effect when reverting some events that expect the existence of that specific key, e.g. DELETE, TRUNCATE, ALTER COLUMN, DROP COLUMN. In this case the restored value will be NULL. Reverting an ALTER COLUMN event would then transform existing data into NULL.

Update a key in the row_log

Call pgmemento.update_key, pass the audit_id, the path to the key in the form of an array, the old and new value which can be of any type.

sql SELECT pgmemento.update_key(555, '{column_B}', 'old_value'::text, 'corrected value'::text);

Both, the old_data and new_data columns will be updated, no matter if logging for these columns is active or not.