Is er een bibliotheek / kader voor undo / redo veranderingen rijen in de database?

stemmen
2

Moge mijn titel is niet duidelijk. Ik ben op zoek naar een soort van versie controle op de database tabellen, zoals Subversion doet op bestanden, zoals wiki doet.

Ik wil op te sporen de veranderingen te melden. Ik wil uitpakken en uitvoeren van de diff in omgekeerde volgorde. (Ongedaan maken als een svn merge -r 101: 100). Ik kan een geïndexeerd zoekopdracht op de geschiedenis nodig.

Ik heb de gelezen Patroon van het Ontwerp voor Undo Engine , maar het is gerelateerd aan Patterns. Zijn er iets wat ik kon opnieuw gebruiken zonder het wiel opnieuw uitvinden?

EDIT: Bijvoorbeeld, bankrekening transacties. Ik heb kolom evenwicht (en anderen) bijgewerkt in tabel. zal een gebruiker een fout in de hem 10 dagen later te vinden, en hij zal willen annuleren / terugdraaien van de specifieke transactie, zonder dat anderen.

Hoe kan ik dat doen sierlijk in de applicatie-niveau?

De vraag is gesteld op 09/12/2008 om 15:08
bron van user
In andere talen...                            


7 antwoorden

stemmen
2

Je zou een herziening aanpak voor elke record dat u wilt traceren gebruiken. Dit zou leiden tot een rij in de tabel met behoud van voor elke herziening van een record. De gegevens zouden op elkaar worden aangesloten door middel van een gedeelde 'ID' en kan worden opgevraagd op de 'Revision Status' (bv Ontvang het laatste "Approved" record).

In uw aanvraag tier, kunt u deze records individueel behandelen en teruggaan naar een eerdere staat, indien nodig, zolang je alle nodige informatie op te nemen.

[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
antwoordde op 09/12/2008 om 16:40
bron van user

stemmen
2

Martin Fowler heeft betrekking op het onderwerp in Patronen voor dingen die veranderen met de tijd . Nog steeds patronen en geen echte kader, maar hij toont bijvoorbeeld gegevens en hoe het te gebruiken.

antwoordde op 09/12/2008 om 16:19
bron van user

stemmen
1

Pedant punt. Uw bankrekening voorbeeld zou niet voorbij een accountant / regelaar.

Elke foutieve boekingen op een rekening moet er worden gelaten voor het record. Een gelijke en tegengestelde correctie transactie zou worden toegepast op de rekening. In feite terugrollen de oorspronkelijke transactie maar waarbij een zeer duidelijke sporen van de oorspronkelijke fout en de correctie.

antwoordde op 09/12/2008 om 16:05
bron van user

stemmen
0

Ik ben niet op de hoogte van een specifiek patroon, hoewel ik heb opgezet volledige undo / audit geschiedenissen voor het gebruik van triggers en rowversions.

Er zijn een paar van de apps voor MS SQL waarmee u sleepnet door de logs en zie de werkelijke veranderingen.

Ik kan het niet nu al vinden - Ik heb een zogenaamde Log Navigator terug met MS SQL 2000, dat wordt gebruikt om mij te laten ongedaan te maken een specifieke historische transactie gebruikt.

http://www.lumigent.com en http://www.apexsql.com doen gereedschappen voor het bekijken van de logs, maar ik denk niet dat ofwel kunt u ze terug te draaien.

Ik denk dat de beste manier om dit te doen is om uw aanvraag met dit in het achterhoofd te schrijven - wat je hebt een paar goede suggesties hier al op hoe dat te doen.

antwoordde op 10/12/2008 om 11:20
bron van user

stemmen
0

Op basis van de verschillende opmerkingen een mogelijke oplossing voor uw probleem zou zijn om een ​​"date effectief" table te maken.

In principe betaal je valid-from-date en geldige-to-date kolommen toe te voegen aan elke tafel.

De "huidige" record moet altijd een valid_to_date van "2999/12/31" of een arbiteraly hoge waarde. Wanneer een waarde verandert u de "valid-to-date" om de huidige datum en plaats een nieuwe rij te veranderen met een geldig-van-datum van vandaag en een geldige-to-date van "2999/12/31" kopieer alle kolommen van de oude rij als ze zijn niet gewijzigd.

U kunt weergaven met "select all-kolommen-behalve-valid-XX-date van tafel waar valid-to-date = '2999/12/31'" te creëren

Waarmee al uw huidige vragen om ongewijzigd te werken.

Dit is een veel voorkomende tecnique in data warehouse-omgevingen en voor iets als de wisselkoersen, waar de effectieve datum is belangrijk.

Undo logica zou duidelijk moeten zijn.

antwoordde op 10/12/2008 om 11:07
bron van user

stemmen
0

Ik zou gaan met een bi-temporele database-ontwerp, die u alle benodigde uit te voeren en rollback data zou geven, of dat betekent het invoegen van meer rijen of de latere wijzigingen eenvoudig te verwijderen.

Er is een behoorlijke hoeveelheid subtiliteit om een ​​dergelijke database-ontwerp, maar er is zeer goed boek over het onderwerp:

Het ontwikkelen-Time-georiënteerde database applicaties in SQL door Richard T. Snodgrass

hier te downloaden:

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

Met behulp van een database transactie zou een slecht idee zijn, omdat de sluizen in de database zou leiden - in principe de database transacties moeten zo kort mogelijk zijn.

Alles wat in de applicatielaag, tenzij het heeft een aantal persistentie mechanisme zelf, niet zullen overleven applicatie opnieuw wordt gestart (hoewel dat niet verplicht zou kunnen zijn).

antwoordde op 09/12/2008 om 18:02
bron van user

stemmen
0

Op basis van uw vraag of opmerking voor James Anderson, zou ik de gebruikersinterface schrijven van een nieuw insert bij het annuleren van een transactie. Het zou een nieuwe plaat te voegen in de tabel die dezelfde waarden hebben als de ontbonden transactie tenzij de waarde een negatief getal in plaats van een positief getal zou zijn. Als u een structuur die iets omvat om het doel van de transactie te definiëren, zou ik het zeggen geannuleerd en het record aantal van de transactie was het annuleren.

antwoordde op 09/12/2008 om 17:05
bron van user

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