Czy istnieją jakieś biblioteki / ramy cofania / powtarzania zmiany wierszy w bazie danych?

głosy
2

Może być mój tytuł nie jest jasne. Szukam jakiejś kontroli wersji w tabelach bazy danych, jak Subversion czy na plikach, takich jak wiki robi.

Chcę prześledzić zalogować zmiany. Chcę, aby wyodrębnić i uruchomić diff w odwrotnej kolejności. (Cofnąć jak „nazw połączyć R 101: 100”). Może muszę indeksowane wyszukiwanie w historii.

Czytałem „ wzorzec projektowania dla silnika Cofnij ”, ale jest to związane z „wzorców”. Czy jest coś mogę ponownie użyć bez wyważać otwartych drzwi?

EDIT: Na przykład transakcje kont bankowych. Mam kolumny „równowagi” (i innych) zaktualizowany w tabeli. użytkownik znajdzie błąd przez niego 10 dni później i będzie chciał anulować / wycofać konkretną transakcję, bez zmiany innych.

Jak mogę zrobić to z wdziękiem na poziomie aplikacji?

Utwórz 09/12/2008 o 15:08
źródło użytkownik
W innych językach...                            


7 odpowiedzi

głosy
1

Pedantyczny punkt. Twój przykład rachunku bankowego nie byłoby ominąć audytora / regulatora.

Wszelkie błędne wpisy w rachunku należy pozostawić tam na płycie. Równa i przeciwna transakcja korekta byłaby stosowana do konta. W efekcie wycofywanie pierwotnej transakcji, ale pozostawiając bardzo oczywiste ślady pierwotnego błędu i jego korekty.

Odpowiedział 09/12/2008 o 16:05
źródło użytkownik

głosy
2

Martin Fowler obejmuje temat na wzorce dla rzeczy, które zmieniają się wraz z upływem czasu . Still wzory i nie rzeczywiste ramy ale on pokazuje przykładowe dane i jak go używać.

Odpowiedział 09/12/2008 o 16:19
źródło użytkownik

głosy
2

Można użyć podejście rewizyjnej dla każdego rekordu, który ma być śledzony. To wiązałoby zachowując wiersz w tabeli dla każdej zmiany rekordu. Zapisy będą połączone ze sobą za pomocą dzielonego „ID” i może być sprawdzony na „status zmian” (np Pobierz najnowszy „Approved” Record).

W swojej warstwie aplikacji, można obsługiwać te rekordy indywidualnie i cofnąć do wcześniejszego stanu, jeśli to konieczne, tak długo, jak rejestrować wszystkie niezbędne informacje.

[ID] [Revision Date] [Revision Status] [Modified By] [Balance]
1     1-1-2008         Expired           User1         $100
1     1-2-2008         Expired           User2         $200
2     1-2-2008         Approved          User3         $300
1     1-3-2008         Approved          User1         $250
Odpowiedział 09/12/2008 o 16:40
źródło użytkownik

głosy
0

Opierając się na swoim komentarzu do Jamesa Andersona, chciałbym mieć interfejs użytkownika napisać nową wkładkę, gdy anulowanie transakcji. Byłoby wstawić nowy rekord do tabeli, która miała takie same wartości jak anulowana transakcja oprócz wartości będzie liczbą ujemną zamiast liczbą dodatnią. Jeśli mają strukturę, która zawiera coś do zdefiniowania celu transakcji, chciałbym zrobić to powiedzieć anulowane, a rekordowa liczba transakcji była cofające.

Odpowiedział 09/12/2008 o 17:05
źródło użytkownik

głosy
0

pójdę z bi-skroniowego projektowania baz danych, które daje wszystkie dane potrzebne do wykonania i wycofywania, czy to oznacza, wkładając więcej wierszy lub po prostu usuwając późniejsze modyfikacje.

Jest sporo subtelności do takiego projektowania baz danych, ale jest to bardzo dobra książka na ten temat:

Czas rozwijania aplikacji zorientowanych baz danych w SQL Richard T. Snodgrassa

dostępny do pobrania tutaj:

http://www.cs.arizona.edu/people/rts/tdbbook.pdf

Korzystanie z transakcji bazy danych byłoby złym pomysłem, ponieważ zamki byłoby utworzyć w bazie danych - w zasadzie transakcji bazy danych powinny być jak najkrótsze.

Wszystko w warstwie aplikacji, chyba że ma jakiś samego mechanizmu trwałości, nie przetrwają restartu aplikacji (mimo, że nie może być to wymóg).

Odpowiedział 09/12/2008 o 18:02
źródło użytkownik

głosy
0

Na podstawie różnych komentarzach możliwe rozwiązanie dla Twojego problemu byłoby zrobić „Data wejścia w życie” tabeli.

Basicly dodasz prawidłowych-od aktualnych i ważnych aktualnych kolumn na każdym stole.

„Bieżący” zapis powinien zawsze mieć valid_to_date z „2999-12-31” lub jakiś arbiteraly wysokiej wartości. Gdy wartość zmienia się zmienić „ważny na bieżąco” do bieżącej daty i wstawić nowy wiersz z poprawnym-z-dnia dzisiejszego i ważny do dnia „2999-12-31” Kopiuj wszystko kolumny od starego rzędu, gdyby nie zostały zmienione.

Można tworzyć widoki z „select all-kolumny z wyjątkiem nieważnej-xx-data z tabeli, gdzie obowiązują aktualne =«31.12.2999»”

Który pozwoli wszystkie bieżące zapytania pracować bez zmian.

Jest to bardzo często tecnique w środowiskach hurtowni danych i do rzeczy, takich jak kursy walut, gdzie data wejścia w życie jest bardzo ważne.

Logika cofania powinno być oczywiste.

Odpowiedział 10/12/2008 o 11:07
źródło użytkownik

głosy
0

Nie jestem świadom określonego wzoru, chociaż mam założyć pełne historii cofania / kontrolnych przed użyciem wyzwalaczy i rowversions.

Istnieje kilka aplikacji dla MS SQL, które pozwalają włoka przez dzienniki i zobaczyć rzeczywiste zmiany.

Użyłem jednego dziennika o nazwie Navigator z powrotem z MS SQL 2000, która kiedyś pozwól mi cofnąć konkretnej transakcji historycznych - nie mogę znaleźć go teraz jednak.

http://www.lumigent.com i http://www.apexsql.com zrobić narzędzia do przeglądania logów, ale nie sądzę, albo pozwala toczyć je z powrotem.

Myślę, że najlepszym sposobem, aby to zrobić jest napisanie aplikacji Mając to na uwadze - co masz kilka dobrych sugestii tutaj już o tym, jak to zrobić.

Odpowiedział 10/12/2008 o 11:20
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more