Tutorial: Comparar los esquemas de dos bases de datos
Este tema se aplica a:
Visual Studio Ultimate |
Visual Studio Premium |
Visual Studio Professional |
Visual Studio Express |
---|---|---|---|
En este tutorial, comparará los esquemas de dos bases de datos mediante Visual Studio. La acción de comparación de esquemas también genera un script de Lenguaje de definición de datos (DDL) a partir de las diferencias. Este archivo se usa para sincronizar el esquema del destino con el esquema del origen. Para obtener más información, vea Comparar y sincronizar esquemas de base de datos.
En este tutorial, realizará los siguientes procedimientos:
Crear una base de datos simple. Si ha completado Tutorial: Comparar los esquemas de una base de datos y un proyecto de base de datos, puede usar la base de datos resultante y omitir esta parte del tutorial.
Crear una base de datos vacía. La base de datos CompareProjectDB actuará como origen y creará una base de datos vacía que servirá de destino.
Comparar los esquemas de dos bases de datos. Al comparar los esquemas, encontrará las diferencias estructurales entre las bases de datos, verá esas diferencias en una tabla y generará un script DDL que exprese esas diferencias.
Examinar el script de sincronización. Comprobará el script DDL y podrá editarlo antes de ejecutarlo.
Actualizar la base de datos de destino. Ejecutará el script DDL para cambiar el esquema del destino.
Requisitos previos
Debe tener los siguientes productos instalados:
SQL Server 2008
Permisos para crear y actualizar bases de datos en el servidor de bases de datos de destino
Visual Studio Premium o Visual Studio Ultimate
Crear una base de datos simple
Realizará las siguientes tareas para crear una base de datos simple:
Crear un script que contiene un esquema de base de datos
Crear un proyecto de base de datos e importar ese esquema
Implementar el proyecto de base de datos a un entorno de desarrollo aislado
Crear un script que contiene un esquema de base de datos
Para crear un script del que se puede importar un esquema
En el menú Archivo, elija Nuevo y, a continuación, haga clic en Archivo.
Aparece el cuadro de diálogo Nuevo archivo.
En la lista Categorías, haga clic en General si aún no está resaltada.
En la lista Plantillas, haga clic en Archivo SQL y, a continuación, haga clic en Abrir.
Se abre el editor de Transact-SQL.
Copie el código de Transact-SQL siguiente y péguelo en el editor de Transact-SQL.
PRINT N'Creating Sales...'; GO CREATE SCHEMA [Sales] AUTHORIZATION [dbo]; GO PRINT N'Creating Sales.Customer...'; GO CREATE TABLE [Sales].[Customer] ( [CustomerID] INT IDENTITY (1, 1) NOT NULL, [CustomerName] NVARCHAR (40) NOT NULL, [YTDOrders] INT NOT NULL, [YTDSales] INT NOT NULL ); GO PRINT N'Creating Sales.Orders...'; GO CREATE TABLE [Sales].[Orders] ( [CustomerID] INT NOT NULL, [OrderID] INT IDENTITY (1, 1) NOT NULL, [OrderDate] DATETIME NOT NULL, [FilledDate] DATETIME NULL, [Status] CHAR (1) NOT NULL, [Amount] INT NOT NULL ); GO PRINT N'Creating Sales.Def_Customer_YTDOrders...'; GO ALTER TABLE [Sales].[Customer] ADD CONSTRAINT [Def_Customer_YTDOrders] DEFAULT 0 FOR [YTDOrders]; GO PRINT N'Creating Sales.Def_Customer_YTDSales...'; GO ALTER TABLE [Sales].[Customer] ADD CONSTRAINT [Def_Customer_YTDSales] DEFAULT 0 FOR [YTDSales]; GO PRINT N'Creating Sales.Def_Orders_OrderDate...'; GO ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [Def_Orders_OrderDate] DEFAULT GetDate() FOR [OrderDate]; GO PRINT N'Creating Sales.Def_Orders_Status...'; GO ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [Def_Orders_Status] DEFAULT 'O' FOR [Status]; GO PRINT N'Creating Sales.PK_Customer_CustID...'; GO ALTER TABLE [Sales].[Customer] ADD CONSTRAINT [PK_Customer_CustID] PRIMARY KEY CLUSTERED ([CustomerID] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating Sales.PK_Orders_OrderID...'; GO ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [PK_Orders_OrderID] PRIMARY KEY CLUSTERED ([OrderID] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); GO PRINT N'Creating Sales.FK_Orders_Customer_CustID...'; GO ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [FK_Orders_Customer_CustID] FOREIGN KEY ([CustomerID]) REFERENCES [Sales].[Customer] ([CustomerID]) ON DELETE NO ACTION ON UPDATE NO ACTION; GO PRINT N'Creating Sales.CK_Orders_FilledDate...'; GO ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [CK_Orders_FilledDate] CHECK ((FilledDate >= OrderDate) AND (FilledDate < '01/01/2010')); GO PRINT N'Creating Sales.CK_Orders_OrderDate...'; GO ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [CK_Orders_OrderDate] CHECK ((OrderDate > '01/01/2005') and (OrderDate < '01/01/2020')); GO PRINT N'Creating Sales.uspCancelOrder...'; GO CREATE PROCEDURE [Sales].[uspCancelOrder] @OrderID INT AS BEGIN DECLARE @Delta INT, @CustomerID INT BEGIN TRANSACTION SELECT @Delta = [Amount], @CustomerID = [CustomerID] FROM [Sales].[Orders] WHERE [OrderID] = @OrderID; UPDATE [Sales].[Orders] SET [Status] = 'X' WHERE [OrderID] = @OrderID; UPDATE [Sales].[Customer] SET YTDOrders = YTDOrders - @Delta WHERE [CustomerID] = @CustomerID COMMIT TRANSACTION END GO PRINT N'Creating Sales.uspFillOrder...'; GO CREATE PROCEDURE [Sales].[uspFillOrder] @OrderID INT, @FilledDate DATETIME AS BEGIN DECLARE @Delta INT, @CustomerID INT BEGIN TRANSACTION SELECT @Delta = [Amount], @CustomerID = [CustomerID] FROM [Sales].[Orders] WHERE [OrderID] = @OrderID; UPDATE [Sales].[Orders] SET [Status] = 'F', [FilledDate] = @FilledDate WHERE [OrderID] = @OrderID; UPDATE [Sales].[Customer] SET YTDSales = YTDSales - @Delta WHERE [CustomerID] = @CustomerID COMMIT TRANSACTION END GO PRINT N'Creating Sales.uspNewCustomer...'; GO CREATE PROCEDURE [Sales].[uspNewCustomer] @CustomerName NVARCHAR (40) AS BEGIN INSERT INTO [Sales].[Customer] (CustomerName) VALUES (@CustomerName); SELECT SCOPE_IDENTITY() END GO PRINT N'Creating Sales.uspPlaceNewOrder...'; GO CREATE PROCEDURE [Sales].[uspPlaceNewOrder] @CustomerID INT, @Amount INT, @OrderDate DATETIME, @Status CHAR (1)='O' AS BEGIN DECLARE @RC INT BEGIN TRANSACTION INSERT INTO [Sales].[Orders] (CustomerID, OrderDate, FilledDate, Status, Amount) VALUES (@CustomerID, @OrderDate, NULL, @Status, @Amount) SELECT @RC = SCOPE_IDENTITY(); UPDATE [Sales].[Customer] SET YTDOrders = YTDOrders + @Amount WHERE [CustomerID] = @CustomerID COMMIT TRANSACTION RETURN @RC END GO
En el menú Archivo, haga clic en Guardar SqlQuery_1.sql como.
Aparece el cuadro de diálogo Guardar archivo como.
En Nombre de objeto, escriba SampleImportScript.sql.
Puede guardar el archivo en cualquier ubicación del equipo. Anote la ubicación, porque debe utilizar este script en el procedimiento siguiente.
Haga clic en Guardar.
En el menú Archivo, haga clic en Cerrar solución.
A continuación, cree un proyecto de base de datos e importe el esquema a partir del script que ha creado.
Crear un proyecto de base de datos e importar ese esquema
Para crear un proyecto de base de datos
En el menú Archivo, elija Nuevo y, a continuación, haga clic en Proyecto.
Aparecerá el cuadro de diálogo Nuevo proyecto.
En Plantillas instaladas, expanda el nodo Base de datos y, a continuación, haga clic en SQL Server.
En la lista de plantillas, haga clic en Proyecto de base de datos de SQL Server 2008.
En Nombre, escriba CompareProjectDB.
En la lista Solución, haga clic en Crear solución si aún no aparece resaltado.
Active la casilla Crear directorio para la solución si aún no está activada.
Desactive la casilla Agregar al control de código fuente si aún no está desactivada y haga clic en Aceptar.
El proyecto de base de datos se crea y aparece en el Explorador de soluciones. A continuación, importará el esquema de base de datos desde un script.
Para importar un esquema de base de datos desde un script
En el menú Proyecto, haga clic en Importar script.
Haga clic en Siguiente después de leer la primera página del asistente.
Haga clic en Examinar e indique la ruta de acceso donde guardó el archivo SampleImportScript.sql.
Haga doble clic en el archivo SampleImportScript.sql y haga clic en Finalizar.
Se importa el script y los objetos que se definen en ese script se agregan al proyecto de base de datos.
Revise el resumen y, a continuación, haga clic en Finalizar para completar la operación.
Nota
El procedimiento Sales.uspFillOrder contiene un error de codificación intencionado que se detectará y corregirá en el tutorial de prueba unitaria.
Para examinar el proyecto resultante
En el Explorador de soluciones, expanda el nodo secundario Objetos de esquema.
Explore los subnodos situados bajo el nodo Objetos de esquema en la jerarquía.
El Explorador de soluciones contiene los archivos que definen los objetos de base de datos.
En el menú Ver, haga clic en Vista de esquema.
En Vista de esquema, expanda el nodo CompareProjectDB.
Explore los subnodos situados bajo el nodo CompareProjectDB en la jerarquía.
La Vista de esquema contiene los objetos definidos en los archivos que aparecen en el Explorador de soluciones.
Implementar en un entorno de desarrollo aislado
A continuación, implementará el proyecto para crear una base de datos que tiene el esquema importado, pero ningún dato. Esta base de datos se crea en un entorno de desarrollo aislado o espacio aislado. Por tanto, puede desarrollar y probar la base de datos sin la interferencia de otros trabajos.
Para configurar y compilar el proyecto de base de datos
En el Explorador de soluciones, haga clic en el proyecto de base de datos CompareProjectDB.
En el menú Proyecto, haga clic en Propiedades de CompareProjectDB.
Aparecerá el cuadro de diálogo de propiedades del proyecto.
Haga clic en la pestaña Implementar.
En la lista Configurar valores de implementación para, haga clic en Mi entorno de desarrollo aislado. La configuración de los valores del entorno de desarrollo aislado permite utilizar valores de implementación diferentes de los que se usarán en los demás entornos, como el servidor de prueba o el de producción.
En la lista Acción de implementación, haga clic en Crear un script de implementación (.sql) e implementarlo en la base de datos.
En Configuración de la base de datos de destino, haga clic en Editar.
Aparece el cuadro de diálogo Propiedades de la conexión.
Establezca las propiedades de conexión para la base de datos que desea crear y, a continuación, haga clic en Aceptar.
En el cuadro Conexión de destino, aparecerá la cadena de conexión correcta.
Precaución Debería crear la base de datos en un servidor de pruebas, en un servidor de desarrollo o en un equipo local. No se recomienda especificar el servidor de producción.
En Nombre de la base de datos de destino, escriba CompareProjectDB.
Junto a Archivo de configuración de la implementación, haga clic en Editar.
Desactive la casilla Bloquear la implementación incremental si se puede producir pérdida de datos.
Nota
Para este tutorial, probará los procedimientos almacenados con respecto a una base de datos vacía que se implementa como parte de la prueba unitaria de base de datos. No es necesario conservar ninguno de los datos existentes, porque se van a probar los procedimientos almacenados en el entorno de desarrollo aislado.
En el menú Archivo, haga clic en Guardar todo.
En el menú Generar, haga clic en Generar solución.
Las propiedades que acaba de establecer determinan cómo se compila el script de implementación. El estado de la generación se muestra en la Ventana de salida; la última línea debe ser Generar: 1 correctos o actualizados.
Para implementar el proyecto de base de datos
En el Explorador de soluciones, haga clic en el proyecto de base de datos CompareProjectDB.
En el menú Generar, haga clic en Implementar CompareProjectDB.
Precaución Debería ejecutar esta implementación en un servidor de pruebas, en un servidor de desarrollo o en un equipo local. No se recomienda especificar el servidor de producción.
El proyecto de base de datos se implementa en una nueva base de datos. El estado de la implementación se muestra en la Ventana de salida; la última línea debe ser Implementación correcta. A continuación creará una base de datos vacía que puede comparar con esta base de datos implementada.
Crear una base de datos vacía
Para crear una base de datos vacía
En el menú Archivo, elija Nuevo y, a continuación, haga clic en Proyecto.
Aparecerá el cuadro de diálogo Nuevo proyecto.
En la lista de Plantillas instaladas, expanda el nodo Base de datos y haga clic en SQL Server.
Haga clic en Asistente para SQL Server 2008.
En Nombre, escriba EmptyDB.
Acepte los valores predeterminados para los campos restantes y, a continuación, haga clic en Aceptar.
En el Asistente para nuevo proyecto de base de datos, haga clic en Configurar compilación e implementación.
En la lista Acción de implementación, haga clic en Crear un script de implementación (.sql) e implementarlo en la base de datos.
En Conexión de destino, haga clic en el botón Examinar.
Especifique la conexión al servidor de bases de datos en el que desea crear la base de datos vacía y haga clic en Finalizar.
Se creará un proyecto de base de datos denominado EmptyDB, y aparecerá en el Explorador de soluciones.
En el Explorador de soluciones, haga clic en el proyecto de base de datos EmptyDB.
En el menú Generar, haga clic en Implementar EmptyDB.
El proyecto de base de datos se generará e implementará en el servidor especificado.
Comparar los esquemas de dos bases de datos
Para comparar los esquemas de dos bases de datos
En el menú Datos, elija Comparación de esquemas y haga clic en Nueva comparación de esquemas.
Aparece el cuadro de diálogo Nueva comparación de esquemas, donde puede especificar el origen y el destino. En este cuadro de diálogo se identifican los servidores en los que residen el origen y el destino, el nombre de cada base de datos y el tipo de autenticación que se utilizará cuando se conecte a cada base de datos.
Por otra parte, la ventana Comparación de esquemas se abrirá en segundo plano y Visual Studio le asignará automáticamente un nombre, como SchemaCompare1.
En Esquema de origen, haga clic en Base de datos y, a continuación, haga clic en la conexión que corresponde a la base de datos CompareProjectDB.
Si la conexión correspondiente no aparece en la lista, haga clic en Nueva conexión. En el cuadro de diálogo Propiedades de la conexión, identifique el servidor en el que reside la base de datos CompareProjectDB, el tipo de autenticación que se usará para la conexión con la base de datos y la propia base de datos. Cuando termine, haga clic en Aceptar.
Nota
Una vez que haya establecido una conexión, ésta aparecerá en el Explorador de servidores, en Conexiones de datos.
En Esquema de destino, haga clic en Base de datos y, a continuación, haga clic en la conexión que corresponde a la base de datos EmptyDB.
Si la conexión correspondiente no aparece en la lista, haga clic en Nueva conexión. En el cuadro de diálogo Propiedades de la conexión, identifique el servidor en el que reside la base de datos EmptyDB, el tipo de autenticación que se usará para la conexión con la base de datos y la propia base de datos. Cuando termine, haga clic en Aceptar.
Haga clic en Opciones para especificar qué objetos se comparan, qué tipos de diferencias se pasan por alto y lo que contendrá el script de actualización generado.
Nota
Al comparar bases de datos, no especifica variables SQLCMD.
En la pestaña General, expanda el nodo Opciones de comparación.
Active Omitir nombres y rutas de acceso de archivos y archivos de registro.
Haga clic en Aceptar.
Haga clic en Aceptar.
Se iniciará la comparación de esquemas.
Nota
Si desea detener una comparación en curso, abra el menú Datos, elija Comparación de esquemas y haga clic en Detener comparación de esquemas.
Puede configurar opciones para determinar qué se considera una diferencia y para cambiar el modo en que se crea el script de actualización. Para obtener más información, vea Cómo: Establecer opciones para comparar esquemas de base de datos.
Cuando la comparación finaliza, las diferencias estructurales entre las dos bases de datos aparecen en la tabla de la ventana Comparación de esquemas. La tabla muestra una fila para cada objeto de base de datos que existe en cualquiera de las dos bases de datos. Los objetos de base de datos se organizan por tipo: tablas, vistas, procedimientos almacenados, funciones, etc.
Actualizar la base de datos de destino
Para actualizar el esquema del destino, tiene dos opciones. Puede actualizar el esquema en la ventana Comparación de esquemas directamente o puede hacerlo en el editor de Transact-SQL. En esta sección se describen ambas opciones.
Después de haber realizado la comparación de esquemas, las diferencias estructurales aparecen en la tabla de la ventana Comparación de esquemas. Para cada objeto de la columna CompareProjectDB (base de datos de origen), en la columna Acción de actualización aparece la acción que sería necesaria para sincronizar ese objeto en ambas bases de datos. En este caso, dado que el destino está vacío y sólo contiene objetos predeterminados, la columna Estado contiene principalmente estados nuevos y la columna Acción de actualización contiene principalmente acciones de creación.
Escribir actualizaciones en el destino
Puede actualizar el esquema del destino utilizando las acciones de actualización mostradas en la ventana Comparación de esquemas. Para realizar esta tarea, siga los pasos de Escribir actualizaciones en la base de datos de destino.
Ver el script y después escribir actualizaciones en el destino
Puede exportar un script de actualización, examinarlo, quizás modificarlo y, a continuación, utilizarlo para sincronizar la base de datos de destino. Para realizar estas tareas, siga los pasos de Examinar y ejecutar el script de sincronización.
Escribir actualizaciones en la base de datos de destino
Nota
Antes de escribir actualizaciones en un servidor de producción o de desarrollo, se recomienda realizar una copia de seguridad de la base de datos de destino. Dado que algunos cambios de esquema no se pueden llevar a cabo en una única transacción, podría perder datos si inicia y cancela una operación de actualización. Por ejemplo, puede haberse quitado una tabla de la base de datos de destino antes de volver a crearla. Si cancela la actualización en ese momento, podría perder la tabla. En este tutorial, actualiza una base de datos de desarrollo vacía. Por tanto, no es necesario realizar una copia de seguridad de la base de datos de destino.
Para escribir actualizaciones en la base de datos de destino
En la lista de resultados de la comparación, desplácese al nodo Archivos de SQL.
En el archivo CompareProjectDB y el archivo CompareProjectDB_Log, cambie la acción de actualización de Crear a Omitir.
Nota
Si compara dos bases de datos en el mismo servidor de bases de datos, se producirá un error en la sincronización porque los datos de destino y los archivos de registro ya existen y son utilizados por la base de datos de origen. En este tutorial, simplemente omite las actualizaciones en los archivos y sincroniza el contenido de la base de datos.
En el archivo EmptyDB y el archivo EmptyDB_log, cambie la acción de actualización de Quitar a Omitir.
Nota
Dado que no crea los archivos a partir de la base de datos de origen, no debe eliminar los archivos en la base de datos de destino. En este tutorial, simplemente omite las actualizaciones en los archivos y sincroniza el contenido de la base de datos.
En la barra de herramientas Comparación de esquemas, haga clic en Escribir actualizaciones.
Se ejecutarán las acciones de actualización enumeradas en la ventana Comparación de esquemas. Esta sincronización cambia el esquema del destino para que coincida con el del origen.
Nota
Puede cancelar la acción de actualización mientras se está realizando; para ello, abra el menú Datos, elija Comparación de esquemas y, a continuación, haga clic en Detener escritura en destino.
Si desea volver a ejecutar la comparación para comprobar si se han aplicado las actualizaciones seleccionadas, puede hacer clic en el botón Actualizar en la barra de herramientas Comparación de esquemas.
Examinar y ejecutar el script de sincronización
Para examinar el script de sincronización
En el menú Datos, elija Comparación de esquemas, elija Exportar a y, a continuación, haga clic en Editor.
También puede hacer clic en Exportar a editor en la barra de herramientas Comparación de esquemas.
El editor de Transact-SQL se abre en modo desconectado y muestra el script de sincronización de Transact-SQL. El nombre de esta ventana será similar a Server.CompareProjectDB - SchemaUpdate_EmptyDB_1.sql, y mostrará el script Transact-SQL. Dado que tiene acceso de escritura y lectura en esta ventana, puede cambiar el script. Si lo cambia, abra el menú Archivo y, a continuación, haga clic en Guardar. Al guardar el archivo, puede especificar su ruta de acceso y nombre.
En la barra de herramientas Editor de Transact-SQL, haga clic en Modo SQLCMD.
Si no habilita el modo SQLCMD, aparecerán errores al intentar ejecutar el script.
Para sincronizar los esquemas de las dos bases de datos, ejecute este script; para ello, haga clic en Ejecutar SQL en la barra de herramientas Editor de Transact-SQL o presione la tecla F5.
Aparecerá el cuadro de diálogo Conectar a base de datos.
Haga clic en la conexión que corresponde a la base de datos EmptyDB y haga clic en Aceptar.
Precaución Si intenta ejecutar el script de actualización en una base de datos diferente, podría producir resultados no previstos.
La comparación no se actualiza automáticamente. Si desea volver a ejecutar la comparación para comprobar si se han aplicado las actualizaciones seleccionadas, debe hacer clic en el botón Actualizar en la barra de herramientas Comparación de esquemas.
Pasos siguientes
Ahora, puede comparar los datos de las dos bases de datos. Para obtener más información, vea Cómo: Comparar y sincronizar los datos de dos bases de datos.
Vea también
Tareas
Cómo: Comparar y sincronizar los datos de dos bases de datos
Cómo: Comparar esquemas de base de datos
Tutorial: Comparar los datos de dos bases de datos
Tutorial: Comparar los esquemas de una base de datos y un proyecto de base de datos
Conceptos
Comparar y sincronizar los datos de una o más tablas con datos de una base de datos de referencia
Crear y administrar aplicaciones de capa de datos y bases de datos en Visual Studio