¿Es reversible todo comando DDL SQL? [control de versión de la base de datos]
-
02-07-2019 - |
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.
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.