Jeśli masz edycję korporacyjną 10g, powinieneś zapoznać się z programem Oracle Fine-Grained Auditing. To zdecydowanie lepsze niż toczenie własnego.
Ale jeśli masz mniejszą wersję lub z jakiegoś powodu FGA nie jest w twoim guście, oto jak to zrobić. Najważniejsze jest:zbuduj osobną tabelę audytu dla każdej tabeli aplikacji .
Wiem, że to nie jest to, co chcesz usłyszeć, ponieważ nie pasuje do struktury tabeli, którą opisałeś powyżej. Ale przechowywanie wiersza z wartościami STARY i NOWY dla każdej kolumny, której dotyczy aktualizacja, to naprawdę zły pomysł:
- Nie skaluje się (pojedyncza aktualizacja dotykająca dziesięciu kolumn tworzy dziesięć wstawek)
- A co z wstawieniem rekordu?
- Całkowicie trudno jest zebrać stan rekordu w dowolnym momencie
Tak więc miej tabelę audytu dla każdej tabeli aplikacji o identycznej strukturze. Oznacza to uwzględnienie CHANGED_TIMESTAMP i CHANGED_USER w tabeli aplikacji, ale to nie jest złe.
Wreszcie, i wiesz, dokąd to prowadzi, w każdej tabeli ustaw wyzwalacz, który wstawia cały rekord z tylko wartościami :NEW do tabeli audytu. Reguła powinna zostać uruchomiona podczas INSERT i UPDATE. Daje to pełną historię, dość łatwo jest porównać dwie wersje rekordu. W przypadku DELETE wstawisz rekord kontroli z wypełnionym tylko kluczem podstawowym i wszystkimi pozostałymi kolumnami pustymi.
Twój sprzeciw będzie taki, że masz zbyt wiele tabel i zbyt wiele kolumn, aby zaimplementować wszystkie te obiekty. Ale dość proste jest generowanie tabeli i wyzwalanie instrukcji DDL ze słownika danych (user_tables, user_tab_columns).