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

El tema es aplicable El tema es aplicable El tema no es aplicable El tema no es aplicable

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

  1. Crear un proyecto de base de datos. El nuevo proyecto se inicia vacío.

  2. Importar un esquema de base de datos desde un script.

  3. 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

  1. Agregar una tabla al proyecto de base de datos. Deberá agregar una tabla con tres columnas denominada InternationalShippers.

  2. 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.

  3. 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

  1. En el menú Archivo, elija Nuevo y, a continuación, haga clic en Proyecto.

    Aparece el cuadro de diálogo Nuevo proyecto.

  2. En Plantillas instaladas, expanda el nodo Base de datos y, a continuación, haga clic en SQL Server.

  3. En la lista de plantillas, haga clic en Proyecto de base de datos de SQL Server 2008.

  4. 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

  1. En el menú Archivo, elija Nuevo y, a continuación, haga clic en Archivo.

    Aparece el cuadro de diálogo Nuevo archivo.

  2. En la lista Categorías, haga clic en General si aún no está resaltada.

  3. En la lista Plantillas, haga clic en Archivo SQL y, a continuación, haga clic en Abrir.

    Se abre el editor de Transact-SQL.

  4. 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
    
  5. En el menú Archivo, haga clic en Guardar SqlQuery_1.sql como.

    Aparece el cuadro de diálogo Guardar archivo como.

  6. 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.

  7. Haga clic en Guardar.

  8. 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

  1. En el menú Proyecto, haga clic en Importar script de base de datos.

  2. Haga clic en Siguiente después de leer la primera página del asistente.

  3. Haga clic en Examinar y busque la ubicación en la que guardó el archivo SampleImportScript.sql.

  4. 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.

  5. 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

  1. En el Explorador de soluciones, haga clic en el proyecto CompareProject.

  2. En el menú Proyecto, haga clic en Propiedades de CompareProject.

    Aparecerán las propiedades del proyecto CompareProject.

  3. Haga clic en la pestaña Implementar.

  4. 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.

  5. En Configuración de la base de datos de destino, haga clic en Editar.

  6. 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.

    Nota de precauciónPrecaució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.

  7. En el cuadro Nombre de la base de datos de destino, escriba CompareProjectDB.

  8. En el menú Archivo, haga clic en Guardar todo.

  9. 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

  1. En el Explorador de soluciones, haga clic en el proyecto CompareProject.

  2. 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.

    Nota de precauciónPrecaució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

  1. En el menú Ver, haga clic en Vista de esquema.

    Se abre la Vista de esquema y se muestra el esquema del proyecto CompareProject.

  2. En Vista de esquema, expanda el nodo CompareProject y el nodo Schemas.

  3. 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.

  4. En Plantillas, haga clic en Tabla.

  5. 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.

  6. 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]
    
  7. Haga clic en Guardar InternationalShippers.table.sql.

  8. 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.

  9. 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

  1. En el menú Datos, elija Comparación de esquemas y haga clic en Nueva comparación de esquemas.

  2. Se abre el cuadro de diálogo Nueva comparación de esquemas.

  3. 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

  1. 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.

  2. 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.

    Nota de precauciónPrecaució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