Za chwilę przeprowadzimy testy porównawcze, aby porównać starszy system z nową, błyszczącą wersją. Mamy tabelę bazy danych Oracle, A, która przechowuje dane dla dotychczasowego systemu, i równoważną tabelę, B, która przechowuje dane dla nowego systemu, więc w czasie trwania testu baza danych jest denormalizowana. (Także dotychczasowy system i tabela A są poprawione - nie można wprowadzać żadnych zmian)Prowadzenie tabel synchronizowanych w Oracle
Co chcę zrobić, to pozwolić nieczęstym operacjom DML na A propagować do B i na odwrót. Zacząłem od pary wyzwalaczy, aby to zrobić, ale natrafiłem na oczywisty problem, który powodował, że po uruchomieniu wyzwalaczy tabele mutują i generowany jest wyjątek.
Czy istnieje standardowy sposób radzenia sobie z tym problemem? Czytałem różne raporty na temat tego, czy za pomocą DBMS_SCHEDULER jest do zrobienia ...
Dzięki,
Andy
Aktualizacja: ja skończyło się chickening z całością wydać i upewnić się, że wszystkie procedury przechowywane, które aktualizują A, również aktualizacja B, i na odwrót.
Oznaczyłem odpowiedź Quassnoi jako zaakceptowaną, ponieważ będę postępować zgodnie z jego sugestiami, jeśli w przyszłości spotkają się z tym samym problemem.
Wyróżniłem odpowiedź JosephStyona, ponieważ krótko pracowałem, dodając dwa wyzwalacze poziomu wstawiania/aktualizacji na tabelach A i B, a następnie wykonując procedurę scalania używając A lub B jako tabeli głównej, w zależności od tego Trigger został uruchomiony (chociaż najpierw sprawdziłem, czy tabela docelowa zostanie zmieniona przez scalenie, wcześniej nie działa).
@Andy: jeśli twoja starsza aplikacja korzysta z procedur przechowywanych w celu aktualizacji tabel, to na litość boską po prostu wprowadź swoją logikę do procedur, ponieważ tak właśnie powinno być. Moje porady są dobre tylko dla słabo opracowanych aplikacji, które wydają instrukcje DML (zamiast wywoływać procedury) w celu aktualizacji danych. – Quassnoi