La comparación entre esquemas de 2 bases de datos, puede ser una tarea titánica si se realiza de forma manual. Es por eso, que en esta serie de posts, indicaré cómo llevar a cabo comparaciones entre esquemas de bases de datos, comparaciones entre los datos de diferentes bases de datos, y finalmente, veremos paso a paso cómo realizar una aplicación para que podamos utilizarla en nuestros desarrollos sin depender de herramientas de terceros. Iniciemos entonces con esta serie que espero sea de su agrado, y a más de uno sirva como me ha servido a mí.
En la red existen múltiples aplicaciones, que nos prometen llevar a cabo la comparación entre bases de datos de una forma sencilla, a menudo, estas aplicaciones tienen un costo. Algunas de estas son:
Es cierto que cada quien tiene el derecho de ponerle el precio a los productos que desarrolla, pero no creo conveniente comprar una licencia de alguno de estos productos, si sólo la utilizaremos una vez en un año. Es por ello, que en esta serie de posts, recomendaremos algunas herramientas que nos pueden ayudar a llevar a cabo dichas tareas de forma sencilla y sin pagar un sólo peso (Aunque si tienes oportunidad, te recomiendo realizar donaciones a este tipo de proyectos):
Requisitos previos:
Para poder reproducir lo que haremos en esta serie posts, debes ejecutar este script sobre tu servidor de bases de datos:
Script para pruebas
El contenido de dicho archivo, es el siguiente:
CREATE DATABASE BlogTestSource
GO
CREATE DATABASE BlogTestTarget
GO
USE [BlogTestSource]
GO
/****** Object: Table [dbo].[Person] Script Date: 25/02/2015 08:33:33 p. m. ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Person](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](100) NOT NULL,
[Age] [int] NOT NULL,
[Gender] [int] NOT NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
USE [BlogTestTarget]
GO
/****** Object: Table [dbo].[Person] Script Date: 25/02/2015 08:33:51 p. m. ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Person](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](200) NOT NULL,
[Age] [int] NOT NULL,
[Gender] [char](1) NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
USE [BlogTestSource]
GO
SET IDENTITY_INSERT [dbo].[Person] ON
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (1, N'Rick', 31, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (2, N'Sasha', 22, 2)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (3, N'Daryl', 19, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (4, N'Glenn', 23, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (5, N'Maggie', 18, 2)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (6, N'Carl', 10, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (7, N'Carol', 40, 2)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (8, N'Michonne', 31, 2)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (9, N'Eugene', 27, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (10, N'Rosita', 18, 2)
SET IDENTITY_INSERT [dbo].[Person] OFF
GO
USE [BlogTestTarget]
GO
SET IDENTITY_INSERT [dbo].[Person] ON
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (1, N'Rick', 31, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (2, N'Sasha', 22, 2)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (3, N'Daryl', 19, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (4, N'Glenn', 23, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (5, N'Maggie', 18, 2)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (6, N'Carl', 10, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (7, N'Carol', 40, 2)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (8, N'Michonne', 31, 2)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (9, N'Eugene', 27, 1)
INSERT [dbo].[Person] ([Id], [Name], [Age], [Gender]) VALUES (10, N'Rosita', 18, 2)
SET IDENTITY_INSERT [dbo].[Person] OFF
GO
DbComparer
Eso es lo que describe el sitio web:
DBComparer es una herramienta de comparación de base de datos profesional para el análisis de las estructuras de base de datos de diferencias en Microsoft SQL Server 2008 (y 2005). Es una excelente herramienta para cualquier equipo de desarrollo de proyecto o DBA gestión de múltiples copias de la misma base de datos en un servidor SQL. Esta herramienta de comparación de base de datos tiene una interfaz limpia y directa. Resultados se presentan claramente para que usted puede ver inmediatamente las diferencias en sus bases de datos. Hará que localizar y eliminar las diferencias en su base de datos rápida y fácil.
Al realizar la primer ejecución, se nos despliega el siguiente cuadro de diálogo, donde deberemos seleccionar la base de datos de la izquierda (origen) y la base de datos de la derecha (destino), de la siguiente manera (si es que has ejecutado el script que te he puesto al inicio del post):
Posteriormente daremos click al botón “Compare Now”, lo que iniciará una comparación entre las bases de datos seleccionadas, mostrándonos lo siguiente:
Podemos ver, de manera sencilla, dónde tenemos diferencias de esquema entre ambas bases de datos, ya que es mostrado con color rojo, en este caso, es en el folder de las tablas donde tenemos conflictos, expandamos para ver lo que ocurre:
Si seguimos expandiendo los nodos, veremos cuáles son los campos en los que tenemos conflictos:
Seleccionando sobre la tabla (En este caso, dando click sobre dbo.Person), veremos diferentes secciones con información diferente, describiremos una por una:
Ventana de propiedades:
Nos mostrará las propiedades de cada una de las tablas en cuanto a estructura de la tabla en sí se refiere.
Ventana de diferencias:
Aquí podremos ver, de forma muy rápida y sencilla, las diferencias entre ambas tablas, en este ejemplo, vemos 2 líneas que contienen diferencias entre ambas bases de datos. Las diferencias son:
Línea 3: existe una diferencia en la definición de nvarchar, nuestra tabla orígen define un largo de 100, mientras que nuestra tabla destino define un largo de 200.
Línea 5: El campo es int en la tabla orígen, mientras que es un tipo char(1) en nuestra tabla destino.
Venta de diferencias por línea:
Nos permite comparar línea por línea, de acuerdo a la línea que tengamos seleccionada en la venta de diferencias. para realizar un análisis más detallado sobre cada línea, bastante útil si la consulta contiene varias líneas de código.
Desventajas de esta herramienta:
La única desventaja que encontré con esta herramienta, es que no podemos llevar a cabo la ejecución de scripts para igualar ambas bases de datos, por lo que tendremos que realizar cada una de ellas de forma manual.
En la siguiente entrega analizaremos la siguiente herramienta para comparar bases de datos,
¡Hasta entonces colegas!