Comparar la estructura de dos bases de datos con DbWrench

jueves, mayo 15, 2014
Banner DbWrench

En esta oportunidad les traigo una herramienta que me ha sacado de apuros en algunas ocasiones y se llama DbWrench. Aunque es de pago, la versión de pruebas permite usar todas las opciones disponibles.

Para esta entrada voy a enfocarme en la función de comparación de estructuras de base de datos que tiene la herramienta, al final del proceso vamos a obtener un script SQL con las diferencias encontradas.


Si te interesa tengo una nueva entrada donde explico cómo comparar la estructura de dos bases de datos PostgreSQL con pgAdmin 4.


La aplicación funciona con diferentes motores de bases de datos: MS Access, MS SQL Server, MySql, Oracle y PostgreSQL. En mi caso solo he probado con PostgreSQL.

Lo primero que tenemos es que descargarla de la página oficial. El software es una especie de aplicación portable ya que no requiere instalación y está disponibles para Linux, Windows y MAC. Solo tenemos que descargarlo, descomprimirlo y listo. En su pagina oficial explica donde esta el archivo ejecutable según tu sistema operativo. En mi caso la estoy ejecutando en Debian por lo que al descomprimirlo solo tengo que ir dentro de la carpeta descomprimida a /bin y ejecutar el archivo dbwrench3.

Veamos la demostración con un ejemplo. Primero creamos dos bases de datos, una llamada bd_produccion y otra bd_desarrollo. Lo que se busca en ese caso es saber que cambios se han hecho en la bd_desarrollo para poder aplicarlos en la bd_produccion.

A continuación las tablas para crear en cada base de datos:

- Tablas de la base de datos bd_produccion.

--Tabla de personas

CREATE TABLE persona
(
 id_persona CHARACTER VARYING(9) PRIMARY KEY,
 nombres CHARACTER VARYING(100),
 apellidos CHARACTER VARYING(100)
);

--Tabla de cargos

CREATE TABLE cargo
(
 id_cargo serial PRIMARY KEY,
 descripcion CHARACTER VARYING(100)
);

- Tablas de la base de datos bd_desarrollo.

--Tabla de personas

CREATE TABLE persona
(
 id_persona CHARACTER VARYING(9) PRIMARY KEY,
 nombres CHARACTER VARYING(100),
 apellidos CHARACTER VARYING(100),
 direccion TEXT,
 telefonos TEXT
);

--Tabla de cargos

CREATE TABLE cargo
(
 id_cargo serial PRIMARY KEY,
 descripcion CHARACTER VARYING(100)
);

--Tablas de personas / cargos

CREATE TABLE persona_cargo
(
 id_persona CHARACTER VARYING(9) REFERENCES persona(id_persona),
 id_cargo INTEGER REFERENCES cargo(id_cargo)
);

Una vez que tengamos nuestras bases de datos listas para hacer la comparación abrimos el programa DbWrench.

Lo primero que debemos hacer es crear las conexiones a las bases de datos. Esto lo hacemos en el menú Tools->Add Connection:

Menú Tools-Add Connection

Luego configuramos ambas bases de datos:

Ventana Add Connection (Desarrollo)
Ventana Add Connection (Producción)

Ahora buscamos el menú Tools->Database Compare y teniendo seleccionada la base de datos bd_desarrollo hacemos clic en Refresh para traer los esquemas disponibles en la base de datos.

Ventana Tools-Database Compare

Posteriormente hacemos clic en Sync Design para sincronizar la estructura de la base de datos en el Database Explorer en la parte izquierda del programa:

Database Explorer

Ahora seleccionamos la base de datos bd_produccion y hacemos clic nuevamente en Refresh. Ya podremos ver las diferencias entre ambas bases de datos y solo nos restaría ir al menú Tools->Forward Engineer:

Menú Tools-Forward Engineer

Finalmente hacemos clic en Recalculate Script:

Recalculate Script

Obtendremos el siguiente código SQL y podemos guardarlo con la opción Save To File:


/************ Update: Tables ***************/

/************ Update Table: persona ***************/

ALTER TABLE persona ADD direccion TEXT NULL;

ALTER TABLE persona ADD telefonos TEXT NULL;


/************ Add Table: persona_cargo ***************/

/* Build Table Structure */
CREATE TABLE persona_cargo
(
 id_persona VARCHAR(9) NULL,
 id_cargo INTEGER NULL
) WITHOUT OIDS;

/************ Add Foreign Keys ***************/

/* Add Foreign Key: persona_cargo_id_cargo_fkey */
ALTER TABLE persona_cargo ADD CONSTRAINT persona_cargo_id_cargo_fkey
 FOREIGN KEY (id_cargo) REFERENCES cargo (id_cargo)
 ON UPDATE NO ACTION ON DELETE NO ACTION;

/* Add Foreign Key: persona_cargo_id_persona_fkey */
ALTER TABLE persona_cargo ADD CONSTRAINT persona_cargo_id_persona_fkey
 FOREIGN KEY (id_persona) REFERENCES persona (id_persona)
 ON UPDATE NO ACTION ON DELETE NO ACTION;

Otra de las funcionalidades que me gusta de esta herramienta, es la posibilidad de hacer Reverse Engineer (Ingeniería Inversa), es decir, de la estructura de la base de datos, crear automáticamente el Diagrama Entidad-Relación. Puedes ver cómo funciona aquí.

También te puede interesar

Cuando navego por los sitios web, mi parte favorita es leer los comentarios. Es por eso que tus comentarios son un complemento valioso para mis entradas. Cualquier duda o aporte no dejes de escribirlo, en breve lo estaré publicando. ¡Gracias!


12 comentarios

  1. Cuando le doy refresh me sale que contraseña incorrecta. Es la contraseña de la base de datos me imagino...

    ResponderBorrar
  2. Muchas gracias por compartir este tutorial, me sirve de mucho, de hecho ya compare dos base de datos de Postgres en la cual tenìa dudas. Saludos

    ResponderBorrar
  3. luego de navegar un poco, puede encontrar tu blog. Genial justo lo que necesitaba. gracias

    ResponderBorrar
  4. Buen tutorial pero al comparar bases de datos en la parte de "procedures" me muestra las funciones que tengo en mis BD SQL server, no los procedimientos almacenados =(

    ResponderBorrar
    Respuestas
    1. Ha pasado mucho tiempo de éste comentario..., pero lo siento no he probado la herramienta con SQL Server aún. Espero que ya hayas encontrado solución! Éxito!

      Borrar
  5. Una herramienta muy útil. !...Gracias...!

    ResponderBorrar

Lo más reciente

¡Bendiciones para mi Venezuela!

¡Bendiciones para mi Venezuela!