C'è qualche libreria / quadro di annulla / ripeti cambiamenti di righe nel database?

voti
2

Può essere il mio titolo non è chiaro. Sto cercando un qualche tipo di controllo di versione in tabelle di database, come la sovversione fa su file, come wiki fa.

Voglio tracciare log delle modifiche. Voglio estrarre ed eseguire il diff in senso inverso. (Annullare come un svn merge-r 101: 100). Posso avere bisogno di una ricerca indicizzata sulla storia.

Ho letto il Design Pattern per la funzione Undo Engine , ma è legato alla pattern. Ci sono qualche cosa che potrei riutilizzare senza reinventare la ruota?

EDIT: Per esempio, transazioni bancarie. Ho colonna equilibrio (e altri) aggiornato nella tabella. un utente troverà un errore da lui 10 giorni più tardi, e lui vuole annullare / rollback della specifica operazione, senza cambiare gli altri.

Come posso farlo con grazia nel livello di applicazione?

È pubblicato 09/12/2008 alle 15:08
fonte dall'utente
In altre lingue...                            


7 risposte

voti
2

Si potrebbe utilizzare un approccio di revisione per ogni record che si desidera tracciare. Ciò comporterebbe mantenendo una riga nella tabella per ogni revisione di un record. Le registrazioni saranno legati insieme da una condivisa 'ID' e potrebbero essere interrogati sulla 'Stato di revisione' (ad esempio, ricevere le ultime "Approvato" record).

Nel vostro livello applicazione, è possibile gestire questi record singolarmente e ripristinare uno stato precedente, se necessario, fino a quando si registra tutte le informazioni necessarie.

[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
Risposto il 09/12/2008 a 16:40
fonte dall'utente

voti
2

Martin Fowler copre il tema in modelli per le cose che cambiano con il tempo . Ancora modelli e non un quadro reale, ma egli mostra dati di esempio e come usarlo.

Risposto il 09/12/2008 a 16:19
fonte dall'utente

voti
1

punto pedanti. Il tuo esempio conto bancario non sarebbe andare oltre un revisore / regolatore.

Tutte le voci errate in un conto dovrebbero essere lasciati lì per il record. Un'operazione uguale e contraria correzione sarebbe applicato al conto. In effetti il ​​rollback della transazione originale, ma lasciare una traccia molto evidente l'errore originale e la sua correzione.

Risposto il 09/12/2008 a 16:05
fonte dall'utente

voti
0

Io non sono a conoscenza di un modello specifico, anche se ho installato pieni storie undo / revisione prima di usare trigger e rowversions.

Ci sono un paio di applicazioni per MS SQL che consentono di strascico attraverso i registri e vedere i cambiamenti effettivi.

Ho usato uno chiamato Log Navigator di nuovo con MS SQL 2000 che ha usato per farmi annullare una determinata operazione storica - non riesco a trovare ora però.

http://www.lumigent.com e http://www.apexsql.com fare gli strumenti per visualizzare i registri, ma non credo sia consente di rotolare indietro.

Penso che il modo migliore per farlo è quello di scrivere l'applicazione con questo in mente - che si dispone di un paio di buoni suggerimenti qui già su come fare.

Risposto il 10/12/2008 a 11:20
fonte dall'utente

voti
0

Sulla base dei vari commenti una possibile soluzione per il problema sarebbe quello di fare una "data effettiva" tavolo.

Fondamentalmente si aggiungono colonne valide-da-data e validi-to-date per ogni tavolo.

Il record "corrente" deve sempre avere un valid_to_date di "2999/12/31" o qualche valore arbiteraly alta. Quando si cambia un valore si modifica il "valido-to-date" per la data corrente e inserire una nuova riga con una valida-da-data di oggi e di una valida-to-date di "2999-12-31" copiare tutto il colonne della riga vecchia se non sono stati modificati.

È possibile creare viste con "selezionare tutte le colonne, tranne-valid-xx-data da tavolo dove valida-to-date = '2999/12/31'"

Che permetterà a tutte le vostre domande attuali di lavorare invariato.

Si tratta di una tecnica molto comune in ambienti di data warehouse e per cosa del genere in cui i tassi di cambio alla data di efficacia è importante.

La logica di annullamento dovrebbe essere ovvio.

Risposto il 10/12/2008 a 11:07
fonte dall'utente

voti
0

Mi piacerebbe andare con una progettazione di database bi-temporale, che darà tutte le informazioni necessarie per eseguire e rollback, se questo significa l'inserimento di più righe o semplicemente cancellando le modifiche successive.

C'è una discreta quantità di sottigliezza a tale progettazione di database, ma non c'è sono molto buoni libro sull'argomento:

Lo sviluppo di Tempo-oriented applicazioni di database in SQL da Richard T. Snodgrass

disponibile per il download qui:

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

Utilizzando una transazione di database sarebbe una cattiva idea, perché le serrature si creerebbe nel database - in pratica le transazioni di database devono essere il più breve possibile.

Nulla a livello di applicazione, a meno che non abbia qualche meccanismo di persistenza per sé, non sopravviverà riavvio dell'applicazione (anche se questo potrebbe non essere un requisito).

Risposto il 09/12/2008 a 18:02
fonte dall'utente

voti
0

Sulla base della sua commento a James Anderson, avrei l'interfaccia utente scrivere un nuovo inserto quando si annulla una transazione. Si introduce un nuovo record nella tabella che aveva gli stessi valori della transazione soppressi, tranne il valore sarebbe un numero negativo invece di un numero positivo. Se si dispone di una struttura che comprende qualcosa per definire lo scopo della transazione, vorrei farle dire cancellata e il numero record di transazione è stato l'annullamento.

Risposto il 09/12/2008 a 17:05
fonte dall'utente

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