Estoy trabajando en una serie de aplicaciones Delphi que necesitarán actualizar sus propias estructuras de base de datos en el campo cuando se lanzan nuevas versiones y cuando los usuarios eligen instalar módulos adicionales. Las aplicaciones están usando una variedad de bases de datos integradas (DBISAM y Jet actualmente, pero esto puede cambiar).Versiones de bases de datos en aplicaciones instaladas usando Delphi
En el pasado he hecho esto con DBISAM utilizando los números de versión de usuario que se pueden almacenar con cada tabla. Envié un conjunto adicional y vacío de archivos de base de datos y, al inicio, comparé los números de versión de cada tabla usando FieldDefs para actualizar la tabla instalada si es necesario. Mientras esto funcionó, me pareció torpe tener que enviar una copia adicional de la base de datos y las versiones más recientes de DBISAM han cambiado la metodología de reestructuración de la tabla, así que necesitaré volver a escribir esto de todos modos.
Veo dos formas de implementar esto: almacenar un número de versión con la base de datos y usar scripts DDL para obtener versiones anteriores o almacenar una versión de referencia de la estructura de la base de datos dentro de la aplicación, comparando la referencia al base de datos en la puesta en marcha, y hacer que la aplicación genere comandos DDL para actualizar la base de datos.
Creo que probablemente tendré que implementar partes de ambos. No querré que la aplicación diferencie la base de datos de la estructura de referencia cada vez que se inicie la aplicación (demasiado lento), por lo que necesitaré un número de versión de la estructura de la base de datos para detectar si el usuario está usando una estructura desactualizada. Sin embargo, no estoy seguro de poder confiar en las secuencias de comandos escritas previamente para realizar la actualización estructural cuando la base de datos podría haberse actualizado parcialmente en el pasado o cuando el usuario puede haber cambiado la estructura de la base de datos, por lo que me inclino a utilizar una diff de referencia para la actualización real.
Investigar la pregunta He encontrado un par de herramientas de control de versiones de bases de datos, pero todas parecen dirigidas hacia SQL Server y se implementan fuera de la aplicación real. Estoy buscando un proceso que esté estrechamente integrado en mi aplicación y que pueda adaptarse a diferentes requisitos de la base de datos (sé que tendré que escribir adaptadores, clases de descendientes personalizadas o código de evento para manejar las diferencias en DDL para varios bases de datos, eso no me molesta).
¿Alguien sabe de nada fuera de la plataforma que hace esto o en su defecto, ¿alguien tiene alguna idea sobre:
La mejor manera de almacenar una versión de referencia de una estructura de base de datos relacional genérica dentro de una aplicación .
La mejor manera de diferenciar la referencia contra la base de datos real.
La mejor forma de generar DDL para actualizar la base de datos.
Gracias por una respuesta extremadamente detallada y útil. Pasarán uno o dos días hasta que pueda digerirlo todo. –