Если у вас есть корпоративная версия 10g, вам стоит взглянуть на Oracle Fine-Grained Auditing . Это определенно лучше, чем кататься самостоятельно.
Но если у вас версия меньшего размера или по какой-то причине FGA вам не по вкусу, вот как это сделать. Главное: создать отдельную таблицу аудита для каждой таблицы приложения .
Я знаю, что это не то, что вы хотите услышать, потому что оно не соответствует структуре таблицы, которую вы описали выше. Но сохранение строки со значениями OLD и NEW для каждого столбца, на которое влияет обновление, - очень плохая идея:
- Не масштабируется (одно обновление, затрагивающее десять столбцов, порождает десять вставок)
- Как насчет того, когда вы вставляете запись?
- Собирать состояние записи в любой момент времени - полная боль
Итак, создайте таблицу аудита для каждой таблицы приложения с идентичной структурой. Это означает включение CHANGED_TIMESTAMP и CHANGED_USER в таблицу приложения, но это не плохо.
Наконец, и вы знаете, к чему это ведет, для каждой таблицы есть триггер, который вставляет в таблицу аудита целую запись, содержащую только значения: NEW. Триггер должен срабатывать при вставке и обновлении. Это дает полную историю, достаточно легко отразить две версии записи. Для УДАЛЕНИЯ вы вставите запись аудита только с заполненным первичным ключом, а все остальные столбцы пустыми.
Вы возразите, что у вас слишком много таблиц и слишком много столбцов для реализации всех этих объектов. Но достаточно просто сгенерировать таблицу и вызвать операторы DDL из словаря данных (user_tables, user_tab_columns).