Pregunta

Quiero configurar un mecanismo para rastrear cambios en el esquema de la base de datos, como el que se describe en esta respuesta :

  

Por cada cambio que hagas a la   Base de datos, se escribe una nueva migración.   Las migraciones suelen tener dos métodos:   un " arriba " Método en el que los cambios.   se aplican y un " abajo " método en   Que los cambios se deshacen. Una sola   comando lleva la base de datos hasta   fecha, y también se puede utilizar para traer   La base de datos a una versión específica de   el esquema.

Mi pregunta es la siguiente: ¿Se encuentra cada comando DDL en " arriba " método reversible? En otras palabras, ¿podemos siempre proporcionar un " abajo " ¿método? ¿Te imaginas algún comando DDL que no pueda ser presionado " down " ed?

Por favor, no considere el problema típico de migración de datos en el que durante " arriba " método que tenemos la pérdida de datos: por ejemplo, cambiando un tipo de campo de datetime ( DateOfBirth ) a int ( YearOfBirth ) estamos perdiendo datos que no pueden ser restaurado.

¿Fue útil?

Solución

en el servidor sql cada comando DDL que conozco es un par arriba / abajo.

Otros consejos

Aparte de la pérdida de datos, cada migración que he hecho es reversible. Dicho esto, Rails ofrece una forma de marcar una migración como " destructiva " ;:

  

Algunas transformaciones son destructivas   de una manera que no se puede revertir.   Las migraciones de ese tipo deberían aumentar.   an ActiveRecord :: IrreversibleMigration   excepción en su método hacia abajo.

Consulte la documentación de la API aquí .

Sí, has identificado casos en los que pierdes datos, ya sea al transformarlos o simplemente BORRAR COLUMNA en la sección " arriba " migración.

Otro ejemplo es que podría soltar un objeto SEQUENCE, perdiendo así su estado. El " abajo " la migración recrearía la secuencia, pero comenzaría de nuevo en 1. Esto podría hacer que la secuencia genere valores duplicados. No es un problema si está realizando una migración en una base de datos vacía y desea que la secuencia comience en 1 de todos modos, pero si tiene un número de filas de datos, querrá que la secuencia se restablezca al valor máximo actualmente en uso, lo que es difícil de hacer de manera confiable, a menos que tenga un bloqueo exclusivo en esa mesa.

Cualquier otro DDL que dependa del estado de los datos en la base de datos tiene problemas similares. Probablemente no sea un buen diseño de esquema en primer lugar, solo estoy tratando de pensar en cualquier caso que se ajuste a su pregunta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top