Posso dirti cosa ha funzionato per me. Potrebbero esserci motivi per cui non funziona per te.
Per prima cosa, ho scritto uno strumento per la diffusione di schemi. Era basato su uno strumento di reportistica di progettazione di database fisici che ho scritto anche che esamina un database e stampa un report di tutte le tabelle, colonne, relazioni, indici, vincoli, ecc. Lo strumento diff lo esegue semplicemente su due istanze di database e riporta eventuali differenze . Questo strumento diff mi consente di rilevare le differenze tra le cose che dovrebbero essere le stesse.
Il prossimo pezzo importante è l'igiene. Le modifiche non vengono mai apportate ad-hoc al database di produzione. Sono realizzati con un file SQL che esegue "l'aggiornamento" una volta che sappiamo che è sicuro applicare l'aggiornamento. Lo sappiamo perché l'abbiamo già eseguito sull'istanza di pre-produzione del database e abbiamo fatto alcuni test.
Quanti database hai a prescindere dalla produzione e dalla pre-produzione è davvero un problema di come il tuo progetto è organizzato e non è così rilevante oltre a mantenere la disciplina di non apportare modifiche ad-hoc (a parte l'aggiunta di utenti o dispositivi di archiviazione, ad esempio).
Il prossimo pezzo importante del sistema è il database di sviluppo. Con questo intendo il database utilizzato per testare il codice durante lo sviluppo immediatamente prima del rilascio. Questo è in genere condiviso dagli sviluppatori (che possono anche avere il proprio database per apportare modifiche ed esperimenti privati).
Durante lo sviluppo. ogni volta che viene apportata una modifica al database, aggiornare SQL build-from-scratch e creare un file SQL autonomo che applichi solo questa modifica.
Per fare un rilascio lo farei:
- Crea un database vuoto (chiamerò questo PREV)
- Applica lo script di installazione del database per la precedente versione
- Carica i dati del test in esso (forse i dati campionati dalla produzione). Questo è importante per testare correttamente cose come vincoli e tipi di colonne.
- Applica gli script SQL per eseguire l'aggiornamento (ovvero i file autonomi che ho menzionato sopra)
- Esegui qualsiasi test di rilascio necessario su questo argomento, ma in parallelo:
- Crea un secondo database vuoto (chiamerò questo SUCCESSIVO)
- Esegui l'SQL di installazione da zero per creare il database in NEXT
- Esegui lo strumento di confronto per confrontare PREV e NEXT. A parte il fatto che NEXT non ha dati, dovrebbero essere identici.
- Se tutto è OK, esporta i dati da PREV perché ne avrai bisogno la prossima volta (come il passaggio 3).
Seguire questo processo significa avere sempre due cose a portata di mano:
1. Uno script di creazione da zero che può essere utilizzato per creare nuove istanze di database per nuovi usi (ad es. Per motivi di supporto, per clienti, ecc.)
2. Aggiornare gli script che sono garantiti per funzionare per portare il sistema di produzione in una corrispondenza esatta con i sistemi di sviluppo e di preproduzione (per evitare differenze impreviste nei database).
Per riassumere usando la terminologia della tua domanda, l'importante è assicurarti che anche il database di sviluppo venga modificato solo eseguendo script SchemaChange.sql e anche per assicurarti di disporre di un regime di test sufficientemente affidabile che i tuoi test ti dico quando questo non è accaduto per qualsiasi motivo.