Tutorial: Comparar los esquemas de una base de datos y un proyecto de base de datos
Este tema se aplica a:
Visual Studio Ultimate |
Visual Studio Premium |
Visual Studio Professional |
Visual Studio Express |
---|---|---|---|
En este tutorial se compara el esquema de un proyecto de base de datos con el esquema de una base de datos utilizando Visual Studio. En función del uso que el equipo haga del proyecto de base de datos y la base de datos, le puede interesar copiar los cambios de esquema en un sentido u otro. A medida que el equipo avance en el ciclo de vida del desarrollo de bases de datos, es posible que se produzcan los siguientes escenarios:
El proyecto es el origen y la base de datos es el destino. Puede utilizar un proyecto de base de datos para desarrollar o mantener una base de datos. Después de realizar cambios en el esquema del proyecto, estos cambios se copian a la base de datos, que está hospedada en un servidor de ensayo. El equipo podrá implementar después la base de datos en un servidor de producción.
La comparación que va a realizar en este tutorial genera un script DDL (Lenguaje de definición de datos) basado en las diferencias de los esquemas. Puede usar este script para aplicar a la base de datos todos los cambios (o sólo algunos) del proyecto de base de datos. Para obtener más información, vea Propagar cambios desde el proyecto a la base de datos.
La base de datos es el origen y el proyecto es el destino. A veces se detecta un error en el esquema de una base de datos de producción o el esquema queda anticuado. En ese caso, habrá que actualizar el esquema. Si efectivamente se realiza esta detección, puede ser necesario que el equipo aplique una actualización urgente a la base de datos. Para mantener el proyecto sincronizado con la base de datos, puede importar después la actualización en un proyecto de base de datos. Para obtener más información, vea Cómo: Importar actualizaciones de una base de datos en el proyecto de base de datos.
En este tutorial se explican las siguientes tareas:
Fase de configuración
Crear un proyecto de base de datos. El nuevo proyecto se inicia vacío.
Importar un esquema de base de datos desde un script.
Configurar, compilar e implementar el proyecto de base de datos en el servidor de bases de datos. La base de datos y el proyecto tienen esquemas idénticos.
Fase de producción
Agregar una tabla al proyecto de base de datos. Deberá agregar una tabla con tres columnas denominada InternationalShippers.
Comparar los dos esquemas. En esta comparación, se designa un proyecto de base de datos como origen y la base de datos como destino. Por tanto, en los resultados, la tabla InternationalShippers aparece como una nueva tabla del proyecto de base de datos.
Propagar cambios desde el proyecto a la base de datos. Puede propagar la nueva tabla InternationalShippers desde el proyecto de base de datos a la base de datos implementada. Si sigue este procedimiento, se sobrescribirán elementos de la base de datos de ejemplo.
Nota
También puede propagar los cambios desde una base de datos a un proyecto de base de datos. Para obtener más información, vea Cómo: Importar actualizaciones de una base de datos en el proyecto de base de datos.
Requisitos previos
Para completar esta tutorial, necesita las siguientes aplicaciones y permisos:
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
Fase de configuración
Crear un proyecto de base de datos
Para crear un proyecto de base de datos
En el menú Archivo, elija Nuevo y, a continuación, haga clic en Proyecto.
Aparece 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 CompareProject y haga clic en Aceptar.
El proyecto CompareProject, que está vacío, se abre y aparece en el Explorador de soluciones.
Importar un esquema de base de datos desde un script
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 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 necesitará usarla 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.
Para importar un esquema de base de datos desde un script
En el menú Proyecto, haga clic en Importar script de base de datos.
Haga clic en Siguiente después de leer la primera página del asistente.
Haga clic en Examinar y busque la ubicación en la que guardó el archivo SampleImportScript.sql.
Haga doble clic en el archivo SampleImportScript.sql y, a continuación, 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 de los resultados y, a continuación, haga clic en Finalizar.
Configurar, compilar e implementar el proyecto de base de datos
Estos procedimientos crean una base de datos que tiene el esquema importado en un entorno de desarrollo aislado (o espacio aislado) en el que puede desarrollar y probar la base de datos.
Para configurar y compilar el proyecto de base de datos
En el Explorador de soluciones, haga clic en el proyecto CompareProject.
En el menú Proyecto, haga clic en Propiedades de CompareProject.
Aparecerán las propiedades del proyecto CompareProject.
Haga clic en la pestaña Implementar.
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.
En el cuadro de diálogo Propiedades de la conexión, establezca las propiedades de conexión de la base de datos en la que desea trabajar y, a continuación, haga clic en Aceptar.
En el cuadro Conexión de destino se muestra la cadena de conexión correcta.
Precaución Debe crear la base de datos en un servidor de prueba, en un servidor de desarrollo o en un equipo local. No se recomienda usar el servidor de producción.
En el cuadro Nombre de la base de datos de destino, escriba CompareProjectDB.
En el menú Archivo, haga clic en Guardar todo.
En el menú Generar, haga clic en Generar solución.
El script de implementación se genera de acuerdo con las propiedades de proyecto que acaba de establecer. El estado de la compilación se muestra en la Ventana de salida; la última línea que aparece es Generar: 1 correctos o actualizados.
Para implementar el proyecto de base de datos
En el Explorador de soluciones, haga clic en el proyecto CompareProject.
En el menú Generar, haga clic en Implementar CompareProject.
Si lo desea, también puede hacer clic con el botón secundario en el proyecto en el Explorador de soluciones y, a continuación, hacer clic en Implementar.
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 utilizar 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 que aparece es Implementación correcta.
Fase de producción
Agregar una tabla al proyecto de base de datos
Para agregar una tabla al proyecto
En el menú Ver, haga clic en Vista de esquema.
Se abre la Vista de esquema y se muestra el esquema del proyecto CompareProject.
En Vista de esquema, expanda el nodo CompareProject y el nodo Schemas.
Haga clic con el botón secundario en Sales, elija Agregar y haga clic en Tabla.
Se abre el cuadro de diálogo Agregar nuevo elemento - CompareProject.
En Plantillas, haga clic en Tabla.
En Nombre, escriba InternationalShippers y, a continuación, haga clic en Agregar.
Se agrega una tabla denominada InternationalShippers al proyecto CompareProject. La definición de tabla aparece en el editor de Transact-SQL.
Cambie las instrucciones siguientes del script SQL de InternationalShippers.table.sql:
CREATE TABLE [Sales].[InternationalShippers] ( [ShipperID] [int] NOT NULL IDENTITY(1,1), [CompanyName] [nvarchar] (40) NOT NULL, [Region] [nvarchar] (40) NOT NULL, [Phone] [nvarchar] (24) NULL ) ON [PRIMARY]
Haga clic en Guardar InternationalShippers.table.sql.
En la Vista de esquema, haga clic con el botón secundario en la tabla InternationalShippers y, a continuación, haga clic en Ver archivo en Explorador de soluciones.
En el Explorador de soluciones, el archivo InternationalShippers.sql aparece resaltado.
Presione F4.
Aparece la ventana Propiedades, que muestra las propiedades del archivo InternationalShippers.table.sql. La propiedad Build Action se establece en Generar, lo que indica que el archivo contiene la definición de un objeto de base de datos y debe analizarse y validarse.
Comparar los dos esquemas
Para comparar los dos esquemas
En el menú Datos, elija Comparación de esquemas y haga clic en Nueva comparación de esquemas.
Se abre el cuadro de diálogo Nueva comparación de esquemas.
En Esquema de destino, haga clic en Base de datos y especifique una conexión a la base de datos que implementó anteriormente en este tutorial y haga clic en Aceptar.
El esquema de la base de datos se compara con el esquema del proyecto modificado y los resultados aparecen en la ventana Comparación de esquemas. En la columna CompareProject, se muestra la tabla [Sales].[InternationalShippers]. El estado de la nueva tabla es Nueva y su acción de actualización es Crear. Si propaga los cambios ahora, la tabla se creará en la base de datos de destino. Para obtener más información, vea el procedimiento siguiente.
Para revisar y omitir las diferencias previstas
En la lista de resultados de la comparación, desplácese al nodo Archivos de SQL.
En la base de datos de destino, aparecen en la lista dos filas que tienen el estado Falta: una fila para el archivo de grupo de archivos y una fila para el archivo de registro.
Haga clic en la columna Acción de actualización de cada fila para cambiar la acción a Omitir.
Normalmente, cuando actualiza un esquema de base de datos, no desea cambiar el archivo de grupo de archivos ni el archivo de registro asociado a la base de datos de destino. Si cambia la acción a Omitir, la base de datos de destino seguirá usando sus archivos actuales.
Si lo desea, podrá actualizar posteriormente la base de datos de destino para que coincida con la base de datos de origen.
Propagar cambios desde el proyecto a la base de datos
Para propagar los cambios a la base de datos de destino
En la ventana Comparación de esquemas, haga clic en Escribir actualizaciones.
Nota
El botón Escribir actualizaciones podría estar deshabilitado si el proyecto contiene uno o varios errores. Si ocurre esto, aparece un mensaje en la barra de estado de Comparación de esquemas.
Las acciones que aparecían en la ventana Comparación de esquemas, incluida la acción Crear para la tabla InternationalShippers, se ejecutan. Esta sincronización cambia el esquema de la base de datos de forma que coincida con el proyecto de base de datos. Cuando la operación de actualización se completa, los esquemas se comparan de nuevo y los resultados se actualizan.
Mientras se actualiza el esquema de destino, puede cancelar la operación; para ello, abra el menú Datos, elija Comparación de esquemas y, a continuación, haga clic en Detener escritura en destino.
Precaución Dado que algunos cambios de esquema no se pueden llevar a cabo en el ámbito de una transacción, pueden perderse datos si cancela una operación de actualización. Por ejemplo, es posible que se haya quitado una tabla de la base de datos de destino porque va a crearse de nuevo. Si cancela la actualización en ese momento, podría perder la tabla. Si se produce este tipo de pérdida de datos, deberá comparar de nuevo los esquemas.
Vea también
Tareas
Cómo: Comparar esquemas de base de datos
Cómo: Comparar y sincronizar los datos de dos bases de datos
Conceptos
Comparar y sincronizar esquemas de base de datos
Comparar y sincronizar los datos de una o más tablas con datos de una base de datos de referencia