Database Change Management - Configurazione per script creano iniziali, Script di migrazione successivi

StackOverflow https://stackoverflow.com/questions/2503696

Domanda

Ho un flusso di lavoro di gestione del cambiamento di database in atto. Si basa su script SQL (quindi, non è una soluzione basata sul codice gestito).

La configurazione di base è simile al seguente:

Initial/
    Generate Initial Schema.sql
    Generate Initial Required Data.sql
    Generate Initial Test Data.sql
Migration
     0001_MigrationScriptForChangeOne.sql
     0002_MigrationScriptForChangeTwo.sql
     ...

Il processo a girare di un database è quello di eseguire tutti gli script Initlal, e quindi eseguire gli script di migrazione sequenziali. Uno strumento prende caso delle prescrizioni versioning, ecc

La mia domanda è, in questo tipo di configurazione, è utile mantenere anche questo:

Current/
    Stored Procedures/
        dbo.MyStoredProcedureCreateScript.sql
        ...
    Tables/
        dbo.MyTableCreateScript.sql
        ...
    ...

Con "questo" intendo una directory di script (separati per tipo di oggetto), che rappresenta il creare script per la filatura il corrente / ultima versione del database.

Per qualche motivo, mi piace molto l'idea, ma non posso giustificare concretamente che è bisogno. Mi sto perdendo qualcosa?

I vantaggi sarebbero:

  • Per dev e fonte di controllo, avremmo lo stesso setup oggetto-per-file a cui siamo abituati
  • Per la distribuzione, siamo in grado di girare un nuovo DB di istanza alla versione più recente o eseguendo il iniziale + Migrate, o eseguendo gli script da Current /
  • Per dev, non abbiamo bisogno di un DB di istanza in esecuzione al fine di fare lo sviluppo. Siamo in grado di fare "offline" di sviluppo della corrente / cartella.

Gli svantaggi sarebbero:

  • Per ogni cambiamento, abbiamo bisogno di aggiornare gli script nella corrente / cartelle, così come creare uno script di migrazione (nella migrazione / cartella)

Grazie in anticipo per qualsiasi ingresso!

È stato utile?

Soluzione

In realtà, questo è il modo migliore. Per quanto ingombrante come può sembrare, è meglio che le alternative di utilizzare SQL Compare come strumenti o distribuzione di file .schema VSDB. Ho sostenuto esattamente l'approccio smae da qualche tempo: Version controllo e il database . Le mie applicazioni implementare lo schema v1 dallo script iniziale, quindi eseguire l'aggiornamento di script per ogni versione. Ogni script sa come eseguire l'aggiornamento dalla versione N-1 a N, e solo quello. Il risultato finale è la versione corrente.

Il più grande limite è la mancanza di un file sql autorevole troppo guardare per trovare la corrente Versione di qualsiasi oggetto (stored procedure, tabelle, visualizzare ecc). Ma i vantaggi di essere in grado di distribuire l'applicazione su qualsiasi versione precedente, e il vantaggio di distribuzione da ben controllato e testato script superano di gran lunga l'inconveniente.

Se ti senti male per l'utilizzo di questo processo di distribuzione (script per distribuire v1 quindi applicare v1.1, v1.2 poi ... fino a quando finalmente si applica v4.5, corrente.) Poi tenere questo in mente: esattamente lo stesso processo viene utilizzato da SQL Server internamente per aggiornare il database fra le release. Quando si collega un database più vecchio, si vede il famoso 'database è in esecuzione l'aggiornamento dalla versione 611-612' e si vede che l'aggiornamento va passo dopo passo , non aggiorna direttamente alla versione attuale 651 ( o tutto ciò che è in corso nel tuo caso). Né l'aggiornamento esegue uno strumento diff per distribuire v 651 su v. 611. Questo perché la migliore approccio è quello che basta usare, aggiornare un passo alla volta.

E per aggiungere una risposta reale alla tua domanda, dopo la pubblicazione di uno sproloquio piuttosto obliqua (è un argomento che ho opinioni forti su, si può dire?): Penso che sia utile avere una versione script della versione attuale, ma Penso che dovrebbe essere un contigua consegnabile processo di generazione di integrazione. In altre parole, il server di build dovrebbe costruire il database corrente (utilizzando gli script di aggiornamento) e poi, come un passaggio di generazione, di script fuori il database e produrre una goccia di costruzione con lo script di versione dello schema corrente. Ma chi deve essere utilizzato come riferimento per la ricerca e l'ispezione del codice, non come un risultato finale di distribuzione, il mio 2C.

Altri suggerimenti

Credo che sarà solo fare cose più complesse nel lungo periodo. versioni integrali bisogno di vivere in un singolo script in modo da poter testare lo script in un contesto e sanno che funzionerà correttamente in un altro contesto come la produzione.

Martin,

Se siete nel mondo reale, allora il vostro database di produzione accetta solo aggiornamenti - non hai mai "creare" da zero. Quindi la cosa più importante per voi di essere la memorizzazione, la visione, la revisione, ecc è l'insieme di script di aggiornamento. Quelli sono gli script che renderanno alla produzione, così quelli sono gli unici di reale importanza.

Si sta facendo la cosa giusta rendendoli primario. Ma gli sviluppatori ha bisogno di essere in grado di ottenere un "quadro corrente" di ciò che lo schema assomiglia. DBA piace fare anche questo, anche se (troppo) spesso lo fanno accedendo al server di produzione e sparando qualche tipo di strumento gui. (Yikes!)

L'unica riserva che ho circa il tuo approccio è l'attuale schema precedente / per tipo di oggetto . Questi script devono essere generati automaticamente, dal dump del database stesso. Se li è possibile classificare automaticamente in base al tipo, poi grande! In caso contrario, fare il possibile per renderli facile da navigare, ma la regola guida deve sempre essere "generato automaticamente da un database dal vivo".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top