2009-11-11 27 views
13

He estado buscando durante horas una forma de comprobar en una base de datos en control de fuente. Mi primera idea fue un programa para calcular las diferencias de la base de datos y solicitar a todos los desarrolladores que modifiquen sus cambios como nuevos scripts de diferencias. Ahora, descubro que si puedo volcar una base de datos en un archivo, lo reviso y lo uso como otro tipo de archivo.Control de fuente de base de datos con Oracle

Las principales condiciones son:

  • Obras para Oracle 9R2
  • legible para que podamos usar diff para ver las Diferencias. (Los archivos .dmp no parecen legibles)
  • Todas las tablas en un lote. Tenemos más de 200 tablas.
  • Almacena AMBAS ESTRUCTURAS Y DATOS
  • Admite los tipos CLOB y RAW.
  • Almacena Procedimientos, Paquetes y sus cuerpos, funciones, tablas, vistas, índices, contraints, Secuencias y sinonimos.
  • Se puede convertir en un script ejecutable para reconstruir la base de datos en una máquina limpia.
  • No limitated a muy pequeñas bases de datos (Soporta menos 200.000 filas)

No es fácil. He descargado muchas demos que fallan de una forma u otra.

EDIT: No me importarían los enfoques alternativos siempre que nos permitan verificar un sistema en funcionamiento en contra de nuestro lanzamiento DATABASE STRUCTURE Y OBJECTS + DATA en modo batch.

Por cierto. Nuestro proyecto ha sido desarrollado por años. Algunos enfoques se pueden implementar fácilmente cuando se hace un nuevo comienzo, pero parece difícil en este punto.

EDIT: Para comprender mejor el problema, digamos que algunos usuarios a veces pueden hacer cambios en los datos de configuración en el documento de producción. O los desarrolladores pueden crear un campo nuevo o modificar una vista sin previo aviso en la rama de publicación. Necesito ser consciente de estos cambios o será complicado fusionar los cambios en producción.

+3

¿Desea incluir esos datos reales en las tablas de su control de origen? Si es así, me parece una mala idea ... –

+0

De acuerdo - en la instancia general, pensé que explícitamente no desea incluir datos en el esquema controlado por la versión – Murph

+2

Depende. A menudo hay datos predeterminados que son esenciales para hacer que una base de datos en blanco sea utilizable. Es probable que se incluyan cosas como una cuenta de usuario predeterminada o información de configuración. –

Respuesta

13

Muchas personas intentan hacer este tipo de cosas (esquemas de diff). Mi opinión es

  • El código fuente va a una herramienta de control de versiones (Subversion, CSV, GIT, Perforce ...). Trátelo como si fuera código Java o C, realmente no es diferente. Debe tener un proceso de instalación que lo verifique y lo aplique a la base de datos.
  • DDL ES CÓDIGO FUENTE. También va a la herramienta de control de versiones.
  • Los datos son un área gris; las tablas de búsqueda tal vez deberían estar en una herramienta de control de versiones. La aplicación de datos generados ciertamente no debería.

La forma en que hago las cosas hoy en día es crear scripts de migración similares a las migraciones de Ruby on Rails. Coloque su DDL en scripts y ejecútelos para mover la base de datos entre versiones. Cambios grupales para una publicación en un único archivo o conjunto de archivos. Luego tiene un script que mueve su aplicación de la versión x a la versión y.

Una cosa que nunca más hago (y solía hacerlo hasta que aprendí mejor) es utilizar cualquier herramienta de GUI para crear objetos de base de datos en mi entorno de desarrollo. Escriba las secuencias de comandos DDL desde el primer día; las necesitará de todos modos para promocionar el código de prueba, producción, etc. He visto a mucha gente que usa las GUI para crear todos los objetos y llega el tiempo de lanzamiento. Hay un scrabble para intentar producir scripts para crear/migrar correctamente el esquema que a menudo no se prueban y ¡fallan!

Todos tendrán sus propias preferencias sobre cómo hacer esto, pero he visto muchas cosas mal a lo largo de los años que formaron mis opiniones anteriores.

+2

+1 ... similar a mi experiencia, y agregaré que las SUBVENCIONES deben ser parte del control de fuente. Las subvenciones a menudo se agregan/cambian en entornos de prueba y nunca se capturan para la migración de producción. – dpbradley

+0

+1 para ejecutar scripts de todo. Prefiero un archivo separado por objeto. Admito que podría ser un poco complicado si la base de datos tiene cientos de tablas, pero la mecánica de administrar (digamos) un archivo por esquema es aún más enérgica. – APC

+0

Me gusta la opción de guiones. Es solo que estoy buscando una herramienta para generar la secuencia de comandos incremental. – borjab

2

Oracle SQL Developer tiene una función "Exportar base de datos". Puede producir un único archivo que contiene todos los DDL y datos.

+0

Necesito verificar. Gracias. – borjab

1

Puede que no sea tan fácil como detectar los difs, sin embargo, usamos un archivo de compilación simple. En nuestra rama actual de CVS, tendremos el código de la base de datos "base" desglosado en el ddl para las tablas y desencadenantes y demás. También tendremos la carpeta delta, desglosada de la misma manera. Comenzando desde cero, puede ejecutar "base" + "delta" y obtener el estado actual de la base de datos. Cuando vaya a la producción, simplemente ejecutará la compilación "delta" y terminará. Este modelo no funciona súper bien si tiene un esquema enorme y lo está cambiando rápidamente. (Nota: Al menos entre los objetos de bases de datos como tablas, índices y similares para los paquetes, procedimientos, funciones y disparadores, funciona bien..) Aquí es una tarea ant muestra:

<target name="buildTables" description="Build Tables with primary keys and sequences"> 
<sql driver="${conn.jdbc.driver}" password="${conn.user.password}" 
    url="${conn.jdbc.url}" userid="${conn.user.name}" 
    classpath="${app.base}/lib/${jdbc.jar.name}"> 
    <fileset dir="${db.dir}/ddl"> 
     <include name="*.sql"/> 
    </fileset> 
</sql> 
</target> 
+0

dijo datos también. incluyendo clobs y tipos de datos sin formato. –

+0

También puede almacenar datos en este modelo. Normalmente cargamos los datos como sentencias de inserción y los ejecutamos como parte de la compilación de ant. – Nick

2

utilizo PL/SQL Developer con un complemento de VCS que se integra en Team Foundation Server, pero solo tiene soporte para objetos de base de datos, y no con los datos en sí mismos, que por lo general se quedan fuera del control de la fuente de todos modos.

Aquí está el enlace: http://www.allroundautomations.com/bodyplsqldev.html

+0

Si todo lo que necesita son datos de "inicialización", entonces puede crear los scripts de inserción y almacenarlos también en TFS. – hminaya

+0

Lo usamos y funciona bien para objetos. La obtención automática de datos de inicialización funcionará si también crea tablas. – borjab

+1

Los scripts de creación de tablas se pueden guardar en TFS – hminaya

1

Creo que este es un caso de,

  • Usted está tratando de resolver un problema
  • usted ha llegado a una solución
  • No sabe cómo implementar la solución
  • por lo que ahora está pidiendo ayuda sobre cómo implementar la solución

La mejor manera de obtener ayuda,

  • Cuéntanos cuál es el problema
  • pida ideas para resolver el problema
  • escoger la mejor solución

No puedo decir cuál es el problema que está tratando de resolver. A veces es obvio a partir de la pregunta, este ciertamente no lo es. Pero puedo decirte que esta 'solución' se convertirá en su propia pesadilla de mantenimiento. Si crees que desarrollar la base de datos y la aplicación que la usa es difícil. Esta idea de versionar la base de datos completa en una forma humana legible es casi una locura.

+0

Pero aquí parece que la mayoría de las personas está de acuerdo en que los scripts son la mejor manera de mantener los cambios. No necesita ser solo un gran archivo moster. Existen algunas herramientas bastante decentes que pueden extraer automáticamente la estructura y los objetos e incluso generan las consultas para crearlo o diferenciarlo en otra base de datos.Solo tengo problemas con los datos. De todos modos. Un formato binario (como de .dmp) no parece mejor. No tener un control de fuente de la base de datos ha llevado a problemas difíciles. – borjab

1

¿Has probado Oracle's Workspace Manager? No es que tenga ninguna experiencia con eso en una base de datos de producción, pero encontré algunos experimentos con juguetes prometedores.

+0

que es ideal para versionar datos en una información existente. No tanto para los cambios de ddl demasiado No tanto para la recreación de un nuevo DB –

1

No intente modificar los datos. Simplemente escriba un desencadenador para almacenar lo que sea que desee obtener cuando se modifiquen los datos.

+0

¿Qué pasa? el rendimiento general? – borjab

+0

¿Cuántas miles de veces por segundo cambiaron los datos de configuración de los usuarios? –

1

Por oneroso que pueda ser, una herramienta como TOAD for Oracle puede ser ideal para resolver este tipo de problema.

Dicho esto, mi solución preferida es comenzar con todo el DDL (incluidas las definiciones de procedimientos almacenados) como texto, administrado bajo control de versión y escribir scripts que crearán una base de datos funcional desde el origen. Si alguien quiere modificar el esquema, debe, debe, debe confirmar esos cambios en el repositorio, no solo modificar la base de datos directamente. ¡Sin excepciones! De esta forma, si necesita compilar scripts que reflejen las actualizaciones entre versiones, es una cuestión de tomar todos los cambios comprometidos y luego agregar cualquier DML que necesite para dar masajes a cualquier dato existente para cumplir con los cambios (agregando valores predeterminados para nuevas columnas para filas existentes, etc.) Con todo el DDL (y los datos prepoblados) como texto, la recopilación de diferencias es tan simple como distinguir dos árboles fuente.

En mi último trabajo, tenía scripts NAnt que restauraban bases de datos de prueba, ejecutaban todos los scripts de actualización necesarios, basados ​​en la versión de la base de datos, y luego volcaban el resultado final a DDL y DML. Haría lo mismo con una base de datos vacía (para crear una desde cero) y luego compararía los resultados. Si los dos fueran significativamente diferentes (el programa de volcado no era perfecto), podría decir inmediatamente qué cambios se deben realizar en la actualización/creación de DDL y DML. Si bien utilicé herramientas de comparación de bases de datos como TOAD, no fueron tan útiles como el SQL manuscrito cuando necesité producir scripts generales para el masaje de datos. (El código generado por la máquina puede ser notablemente frágil.)

+0

Había descargado la última demo de Toad. Estoy seguro de que no le permite modificar datos a todas las tablas en una orden. 200 tablas significa repetir la operación manualmente 200 veces. Gracias por la respuesta de todos modos – borjab

1

Pruebe RedGate's Source Control for Oracle. Nunca he probado la versión de Oracle, pero la versión de MSSQL es realmente genial.

Cuestiones relacionadas