Domanda

Voglio impostare un meccanismo per tenere traccia delle modifiche allo schema del DB, come quello descritto in questa risposta :

  

Per ogni modifica apportata a   database, scrivi una nuova migrazione.   Le migrazioni in genere hanno due metodi:   un "sopra" metodo in cui i cambiamenti   vengono applicati e un "giù" metodo in   che i cambiamenti sono annullati. Una sola   Il comando porta il database a   data e può anche essere usato per portare   il database a una versione specifica di   lo schema.

La mia domanda è la seguente: è ogni comando DDL in un " su " metodo reversibile? In altre parole, possiamo sempre fornire un " down " metodo? Riesci a immaginare qualche comando DDL che non può essere "abbassato"?

Ti preghiamo di non considerare il tipico problema di migrazione dei dati durante il periodo di "quotazione" metodo abbiamo perdita di dati: ad es. cambiando un tipo di campo da datetime ( DateOfBirth ) a int ( YearOfBirth ) stiamo perdendo dati che non possono essere restaurato.

È stato utile?

Soluzione

nel server sql ogni comando DDL che conosco è una coppia up / down.

Altri suggerimenti

Oltre alla perdita di dati, ogni migrazione che abbia mai fatto è reversibile. Detto questo, Rails offre un modo per contrassegnare una migrazione come "distruttiva":

  

Alcune trasformazioni sono distruttive   in un modo che non può essere invertito.   Le migrazioni di quel tipo dovrebbero aumentare   un ActiveRecord :: IrreversibleMigration   eccezione nel loro metodo down.

Consulta la documentazione API qui .

Sì, hai identificato casi in cui perdi dati, trasformandoli o semplicemente GOCCIA COLONNA nella sezione "su" la migrazione.

Un altro esempio è che potresti eliminare un oggetto SEQUENCE, perdendo così il suo stato. Il "giù" la migrazione ricrea la sequenza, ma ricomincerebbe da 1. Ciò potrebbe causare la generazione di valori duplicati. Non è un problema se si esegue una migrazione su un database vuoto e si desidera comunque avviare la sequenza da 1, ma se si dispone di un numero di righe di dati, si desidera ripristinare la sequenza al valore massimo attualmente in uso, il che è difficile da fare in modo affidabile, a meno che tu non abbia un blocco esclusivo su quella tabella.

Qualsiasi altro DDL dipendente dallo stato dei dati nel database presenta problemi simili. Probabilmente non è un buon progetto di schema in primo luogo, sto solo cercando di pensare a tutti i casi che si adattano alla tua domanda.

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