2009-02-11 10 views
13

Come architetto di database, sviluppatore e consulente, ci sono molte domande a cui è possibile rispondere. Uno, anche se mi è stato chiesto di recente e ancora non riesco a rispondere bene, è ...Metodologie migliori per il controllo delle modifiche del database

"Qual è uno dei o alcuni dei migliori metodi o tecniche per mantenere le modifiche del database documentate, organizzate e ancora in grado di implementare efficacemente in un singolo sviluppatore o in un ambiente multi-sviluppatore. "

Ciò può comportare stored procedure e altri script di oggetti, ma soprattutto schemi, dalla documentazione, ai nuovi script di aggiornamento fisico, all'implementazione e quindi a tutto tondo. Esistono applicazioni per far sì che ciò avvenga, ma richiedono aggancio e overhead di schema. Mi piacerebbe piuttosto conoscere le tecniche utilizzate senza un grande coinvolgimento di terze parti.

risposta

4

Il modo più semplice che ho visto questo fatto senza l'aiuto di uno strumento esterno è quello di creare un "patch schema", se volete. La patch dello schema è solo un semplice script t-sql. Alla patch dello schema viene assegnato un numero di versione all'interno dello script e questo numero viene memorizzato in una tabella nel database per ricevere le modifiche.

Eventuali nuove modifiche al database comportano la creazione di una nuova patch di schema che è possibile quindi eseguire in sequenza, in modo da rilevare la versione corrente del database ed eseguire tutte le patch di schema intermedie. Successivamente la tabella della versione dello schema viene aggiornata con qualsiasi data/ora in cui la patch è stata eseguita per l'archiviazione per la successiva esecuzione.

Un buon libro che entra nei dettagli come questo si chiama Refactoring Databases.

Se si desidera utilizzare uno strumento esterno, è possibile esaminare il progetto Ruby's Migrations o uno strumento simile in C# denominato Migrator.NET. Questi strumenti funzionano creando classi C# classes/ruby ​​con una migrazione "Avanti" e "Indietro". Questi strumenti sono più ricchi di funzionalità perché sanno come andare avanti e indietro nelle patch dello schema. Come hai affermato, tuttavia, non sei interessato a uno strumento esterno, ma ho pensato di aggiungerlo comunque ad altri lettori.

4
+1

Mi è piaciuto molto questo collegamento. E 'stato pensato e informativo. Molto più della mia risposta accettata. Tuttavia, se ricordo correttamente, le risposte di Overflow dello stack dovrebbero essere più di una risposta/riepilogo e fornire il collegamento; invece di un collegamento solo. Scusate. Ma ancora più importante, grazie è stato fantastico !! Leggilo! – SnapJag

1

Nel mio caso ho uno script di generare ogni volta che cambio il database, ho chiamato il copione come 00001.sql, n.sql e ho una tabella con de numero dell'ultimo script che ho eseguito. È anche possibile vedere Database Documentation

0

finché si aggiungono colonne/tabelle al database sarà un'operazione semplice eseguendo anticipatamente queste modifiche in sql-file. li esegui semplicemente. forse hai qualche ordine di eseguirli.

una buona soluzione sarebbe quella di creare un file per tabella, in modo che tutte le modifiche che appartengono a questa tabella siano visibili a chiunque lavori sul tavolo (è come lavorare su una classe). lo stesso è valido per stored procedure o viste.

un compito più difficile (e quindi forse gli strumenti sarebbero buoni) è quello di fare un passo indietro. Finché hai appena aggiunto tabelle/colonne, questo non sarebbe un grosso problema. ma se hai scaricato colonne su un aggiornamento e ora devi annullare l'aggiornamento, i dati non ci sono più. sarà necessario ottenere questi dati dal backup. ma tieni a mente, se hai più di un paio di tavoli questo potrebbe essere un grande compito, e nel caso normale dovresti annullare il tuo aggiornamento molto velocemente!

se si potesse semplicemente ripristinare il backup, quindi va bene in questo momento.ma, se aggiorni lunedì, i tuoi clienti lavorano fino a mercoledì e poi vedono che mancano alcuni dati (che hai appena lasciato fuori da una tabella), quindi non puoi semplicemente ripristinare il vecchio database.

Ho un approccio basato sul modello nella mia mente (mi spiace, non implementato al momento) in cui le modifiche dello schema sono "modellate" (ad esempio per xml) e durante un aggiornamento un processore (ad esempio programma aC#) crea tutto il necessario "sql" ed es sposta i dati in un "dropDatabase". i dati possono risiedere lì, e se per qualche ragione ho bisogno di ripristinare alcuni dei dati abbandonati, posso farlo con il processore. Penso che per qualche tempo (anni) questo approccio non sia così male perché altrimenti gli sviluppatori non toccano le tabelle "vecchie" perché non sanno più se la tabella o la colonna è veramente necessaria. con questo approccio non rischi troppo se lasci cadere qualcosa!

0

Quello che faccio è:

  • Tutti i comandi DDL necessarie per ricreare lo schema (e le stored procedure e gli indici, ecc) sono in uno script.
  • Per essere sicuri che lo script sia OK, viene testato di volta in volta (creare un database, eseguire lo script e ripristinare il backup e verificare che il database funzioni correttamente).
  • Per il controllo delle modifiche, lo script viene mantenuto in un sistema di controllo versione (in genere utilizzo Subversion).

Il trucco è che, se il database non può essere portato giù per ricreare con, diciamo, una colonna aggiunta, ho due modifiche da fare, un ALTER TABLE + una modifica nello script. Un po 'più di lavoro ma, a lungo termine, vince.

Problemi correlati