Ако имате корпоративно издание 10g, трябва да погледнете Fine-Grained Auditing на Oracle. Определено е по-добре, отколкото да търкаляте сами.
Но ако имате по-малка версия или по някаква причина FGA не е по вашия вкус, ето как да го направите. Ключовото нещо е:изградете отделна таблица за одит за всяка таблица на приложение .
Знам, че това не е това, което искате да чуете, защото не съответства на структурата на таблицата, която очертахте по-горе. Но съхраняването на ред със СТАРИ и НОВИ стойности за всяка колона, засегната от актуализация, е наистина лоша идея:
- Не се мащабира (една актуализация, докосваща десет колони, създава десет вмъквания)
- Ами когато вмъкнете запис?
- Пълна мъка е да се сглобява състоянието на запис във всеки даден момент
Така че, имайте таблица за одит за всяка таблица на приложението с идентична структура. Това означава включването на CHANGED_TIMESTAMP и CHANGED_USER в таблицата на приложението, но това не е лошо.
И накрая, и знаете докъде води това, имайте тригер за всяка таблица, който вмъква цял запис само със стойностите :NEW в таблицата за одит. Задействането трябва да се задейства при INSERT и UPDATE. Това дава пълната история, достатъчно е лесно да се разграничат две версии на записа. За DELETE ще вмъкнете запис за одит само с попълнен първичен ключ и празни всички останали колони.
Вашето възражение ще бъде, че имате твърде много таблици и твърде много колони, за да приложите всички тези обекти. Но е достатъчно просто да генерирате таблицата и да задействате DDL изрази от речника на данните (user_tables, user_tab_columns).