Share via


Tutorial: Aplicar las técnicas de refactorización de base de datos

Mediante el uso de la refactorización en Visual Studio Premium o Visual Studio Ultimate, puede reducir el número de tareas repetitivas y propensas a errores que debe realizar cuando diseña y actualiza un esquema de base de datos. Por ejemplo, puede utilizar la refactorización para actualizar las referencias a un objeto de base de datos si es necesario cambiar su nombre o si el objeto debe moverse a otro esquema. Si adopta este enfoque, puede aumentar la velocidad y la precisión de los cambios rutinarios en el diseño de bases de datos.

Este tutorial muestra un escenario típico de desarrollo de bases de datos. Para agregar funciones a una base de datos existente, debe realizar la implementación inicial y, a continuación, revisarla con otro miembro del equipo. Durante la revisión, identificará varios problemas que debe resolver antes de proteger los cambios. A continuación, utilizará una serie de técnicas de refactorización para cambiar el esquema.

En este tutorial se explican las siguientes tareas:

  • Importar su esquema de base de datos

  • Implementar una tarea de desarrollo de base de datos típica

  • Corregir un error de código

  • Completar la tarea de desarrollo

  • Ocuparse de los comentarios de revisión del código

Requisitos previos

Para realizar este tutorial, necesita lo siguiente:

  • Visual Studio Premium o Visual Studio Ultimate

  • Acceso de solo lectura a un servidor de bases de datos en el que esté instalada la base de datos AdventureWorks2008.

Importar su esquema de base de datos

Antes de cambiar un esquema en un entorno de equipo, normalmente desprotege un proyecto existente en su sistema de control de versiones. Para este tutorial, cree un proyecto de base de datos e importe el esquema de la base de datos de ejemplo AdventureWorks2008.

Para crear un proyecto de base de datos

  1. En el menú Archivo, elija Nuevo y haga clic en Proyecto.

    Aparecerá el cuadro de diálogo Nuevo proyecto.

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

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

  4. En Nombre, escriba RefactorAdventureWorks y haga clic en Aceptar.

    Así se crea una solución que contiene un proyecto de base de datos vacío denominado RefactorAdventureWorks, como su proyecto de prueba (también conocido como un espacio aislado).

    A continuación, importe el esquema desde una instancia implementada de la base de datos AdventureWorks.

Para importar la base de datos AdventureWorks

  1. En el Explorador de soluciones o en la Vista de esquema, haga clic en RefactorAdventureWorks.

  2. En el menú Proyecto, haga clic en Importar objetos y configuración de base de datos.

    Nota

    También puede hacer clic con el botón secundario en RefactorAdventureWorks y, a continuación, hacer clic en Importar objetos y configuración de base de datos.

    Aparecerá el Asistente para importar bases de datos.

  3. En la lista Conexión de base de datos de origen, haga clic en la conexión que corresponde a la base de datos AdventureWorks.

    Nota importanteImportante

    Si todavía no se ha conectado a esa base de datos, en primer lugar debe hacer clic en Nueva conexión para crearla. Para obtener más información, vea Cómo: Crear una conexión a una base de datos.

  4. Cuando se hayan importado los objetos y los valores, haga clic en Iniciar y, después, en Finalizar.

    Cuando se importa el esquema, los elementos de proyecto que se corresponden con los objetos de su base de datos aparecen bajo el proyecto de base de datos en el Explorador de soluciones y en la Vista de esquema.

    Nota

    Aunque se conectó a la base de datos para importar el esquema, ahora está desconectado y trabaja sin conexión.

    A continuación realizará una tarea típica de desarrollo de bases de datos: agregar código al proyecto de base de datos.

Implementar una tarea de desarrollo de base de datos típica

Para esta tarea, se le ha solicitado que implemente una función para realizar el seguimiento del historial de ausencias de cada empleado. Como parte de esta tarea, debe crear los siguientes objetos:

  • Una tabla que realice el seguimiento de la fecha de inicio y finalización de cada ausencia y el tipo de ésta (vacaciones, baja por enfermedad, asistencia como jurado, día no laborable, baja sin sueldo o día libre por defunción de un familiar). En una fase posterior de este tutorial agregará la tabla al esquema Person. Los datos de la tabla tienen las siguientes restricciones:

    • Las ausencias nunca son de más de cinco días. (Las ausencias más prolongadas se dividen en varias entradas).

    • Las ausencias tienen intervalos de fechas válidos.

    • La tabla está relacionada con la tabla Employee por el EmployeeID.

  • Una vista que muestre el historial de ausencias completo de cada empleado.

  • Un procedimiento almacenado que registre una ausencia y actualice las horas de vacaciones del empleado si el tipo de ausencia es por vacaciones.

Para prepararse para agregar código

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

  2. En la Vista de esquema, expanda el nodo RefactorAdventureWorks.

  3. Si la Vista de esquema está ordenada por tipo de objeto, haga clic en Cambiar agrupación de objetos en la barra de herramientas.

    Nota

    La Vista de esquema está ordenada por tipo de objeto si contiene nodos denominados Tablas y Vistas. Si la Vista de esquema contiene un nodo denominado Esquemas, puede continuar con el procedimiento siguiente.

    A continuación, agregue la tabla AbsenceHistory al proyecto de base de datos.

Para agregar la tabla AbsenceHistory

  1. En la Vista de esquema, expanda el nodo Esquemas y los subnodos Person y Tablas.

  2. Haga clic con el botón secundario en el subnodo Tablas, seleccione Agregar y haga clic en Tabla.

    Aparecerá el cuadro de diálogo Agregar nuevo elemento.

  3. En el cuadro Nombre, escriba AbsenceHistory y haga clic en Agregar.

    Se abre el editor de Transact-SQL, que muestra la definición de la tabla AbsenceHistory.

  4. En el editor de Transact-SQL, sustituya la definición de tabla existente por el código siguiente:

    CREATE TABLE [Person].[AbsenceHistory]
    (
    [EmployeeID] INT NOT NULL, 
    [BeginDate] DateTime NOT NULL,
    [EndDate] DateTime NOT NULL,
    [AbsenceType] NCHAR(1) NOT NULL
    );
    
  5. En el menú Archivo, haga clic en Guardar Person.AbsenceHistory.table.sql.

    A continuación, agregue una restricción CHECK a la tabla AbsenceHistory.

Para agregar la restricción CHECK a la tabla

  1. En la Vista de esquema, expanda el nodo AbsenceHistory.

  2. Haga clic con el botón secundario en el nodo Restricciones, seleccione Agregar y haga clic en Restricción CHECK.

    Aparecerá el cuadro de diálogo Agregar nuevo elemento.

  3. En Nombre, escriba CK_AbsenceHistory_ValidDates y haga clic en Agregar.

    Se abre el editor de Transact-SQL, que muestra la definición de la restricción.

  4. En el editor de Transact-SQL, sustituya la definición de restricción existente por el código siguiente:

    ALTER TABLE [Person].[AbsenceHistory]
    ADD CONSTRAINT [CK_AbsenceHistory_ValidDates] 
    CHECK  (EndDate >= BeginDate AND DateDiff(day, EndDate, BeginDate) <= 5)
    go
    EXECUTE sp_addextendedproperty @name = N'MS_Description', 
    @value = 'Check constraint [EndDate]>= [BeginDate]', 
    @level0type = N'SCHEMA', 
    @level0name = N'Person', 
    @level1type = N'TABLE', 
    @level1name = N'AbsenceHistory', 
    @level2type = N'CONSTRAINT', 
    @level2name = N'CK_AbsenceHistory_ValidDates';
    

    Este código define una restricción en la tabla que garantiza que la fecha de finalización sea posterior a la de inicio y que el delta entre ellas no supere los cinco días.

  5. En el menú Archivo, haga clic en Guardar Person.AbsenceHistory.CK_AbsenceHistory_ValidDates.chkconst.sql.

    A continuación, agregue una clave externa a la tabla AbsenceHistory.

Para agregar la definición de clave externa

  1. En la Vista de esquema, haga clic con el botón secundario en el nodo Claves, elija Agregar y haga clic en Clave externa.

    Aparecerá el cuadro de diálogo Agregar nuevo elemento.

  2. En Nombre, escriba FK_AbsenceHistory_Employee_EmployeeID y haga clic en Agregar.

    Se abre el editor de Transact-SQL, que muestra la definición de la clave externa.

  3. En el editor de Transact-SQL, sustituya la definición existente de clave externa por el siguiente código:

    ALTER TABLE [Person].[AbsenceHistory]
    ADD CONSTRAINT [FK_AbsenceHistory_Employee_EmployeeID] 
    FOREIGN KEY ([EmployeeID]) 
    REFERENCES [HumanResources].[Employee] ([BusinessEntityID]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION;
    
    GO
    EXECUTE sp_addextendedproperty @name = N'MS_Description', 
        @value = 'Foreign key constraint referencing Employee.BusinessEntityID.', 
        @level0type = N'SCHEMA', 
        @level0name = N'Person', 
        @level1type = N'TABLE', 
        @level1name = N'AbsenceHistory', 
        @level2type = N'CONSTRAINT', 
        @level2name = N'FK_AbsenceHistory_Employee_EmployeeID';
    

    Este código define una relación de clave externa entre EmployeeID en la tabla AbsenceHistory y BusinessEntityID en la tabla [HumanResources].[Employee].

  4. En el menú Archivo, haga clic en Guardar Person.AbsenceHistory.FK_AbsenceHistory_Employee_EmployeeID.fkey.sql.

    En este punto, se da cuenta de que la tabla debería estar en el esquema HumanResources. En el procedimiento siguiente, corregirá este error.

Corregir un error de código

Dado que ya ha definido restricciones y claves externas, al mover una tabla y sus objetos relacionados a otro esquema, normalmente perderá mucho tiempo. Puede utilizar la refactorización para mover con rapidez y facilidad la tabla y sus objetos relacionados al esquema correcto antes de continuar.

Para mover la tabla AbsenceHistory al esquema HumanResources

  1. En la Vista de esquema, haga clic con el botón secundario en la tabla AbsenceHistory, elija Refactorizar y haga clic en Mover a esquema.

    Aparecerá el cuadro de diálogo Mover esquema.

  2. En la lista Nuevo esquema, haga clic en HumanResources.

  3. Compruebe que la casilla Vista previa de los cambios está activada y haga clic en Aceptar.

    Aparece el cuadro de diálogo Vista previa de los cambios. Puede revisar los cambios antes de aplicarlos al proyecto de base de datos.

  4. Haga clic en Aplicar.

    Los cambios de refactorización se aplican a su proyecto de base de datos. La tabla AbsenceHistory se mueve del esquema Person al esquema HumanResources, junto con todos los objetos relacionados.

  5. En la Vista de esquema, expanda el nodo de esquema HumanResources y, a continuación, expanda el nodo Tablas.

    La tabla AbsenceHistory aparece en el esquema correcto.

    Nota

    Al mover los objetos al esquema correcto, no cambió los nombres de los archivos en los que se definen los objetos. Si desea actualizar los nombres de archivo, debe cambiarles el nombre en el Explorador de soluciones.

    A continuación, completará los pasos restantes de la tarea de desarrollo.

Completar la tarea de desarrollo

Ahora que ha corregido el esquema de la tabla, tiene que crear los siguientes objetos:

  • Una vista que muestre el historial de ausencias completo de cada empleado.

  • Un procedimiento almacenado que registre una ausencia y actualice las horas de vacaciones del empleado si el tipo de ausencia es por vacaciones.

Para agregar la vista vEmployeeAbsenceHistory

  1. En la Vista de esquema, en el esquema HumanResources, expanda el nodo Vistas.

  2. Haga clic con el botón secundario en el nodo Vistas, seleccione Agregar y haga clic en Vista.

    Aparecerá el cuadro de diálogo Agregar nuevo elemento.

  3. En Nombre, escriba vEmployeeAbsenceHistory y haga clic en Agregar.

    Se abre el editor de Transact-SQL, que muestra la definición de la vista.

  4. En el editor de Transact-SQL, sustituya la definición de vista existente por el código siguiente:

    CREATE VIEW [HumanResources].[vEmployeeAbsenceHistory]
    AS 
    SELECT 
        a.* 
        ,c.[Title] 
        ,c.[FirstName] 
        ,c.[MiddleName] 
        ,c.[LastName] 
        ,c.[Suffix] 
    FROM [HumanResources].[Employee] e
        INNER JOIN [Person].[Person] c 
        ON c.[BusinessEntityID] = e.[BusinessEntityID]
        INNER JOIN [AbsenceHistory] a 
        ON e.[BusinessEntityID] = a.[EmployeeID] 
    ;
    
    GO
    EXECUTE sp_addextendedproperty @name = N'MS_Description', 
    @value = 'Returns employee name and absence history.', 
    @level0type = N'SCHEMA', 
    @level0name = N'HumanResources', 
    @level1type = N'VIEW', 
    @level1name = N'vEmployeeAbsenceHistory';
    

    Este código define una vista que devuelve datos de una combinación de las tablas Employee, Contact y AbsenceHistory.

  5. En el menú Archivo, haga clic en Guardar HumanResources.vEmployeeAbsenceHistory.view.sql.

    A continuación agregue un procedimiento almacenado.

Para agregar el procedimiento almacenado uspRecordAbsence

  1. En la Vista de esquema, en el esquema HumanResources, expanda el nodo Programación y, a continuación, Procedimientos almacenados.

  2. Haga clic con el botón secundario en el nodo Procedimientos almacenados, seleccione Agregar y haga clic en Procedimiento almacenado.

    Aparecerá el cuadro de diálogo Agregar nuevo elemento.

  3. En Nombre, escriba uspRecordAbsence y haga clic en Agregar.

    Se abre el editor de Transact-SQL, que muestra la definición del procedimiento almacenado.

  4. En el editor de Transact-SQL, sustituya la definición existente de procedimiento almacenado por el siguiente código:

    CREATE PROCEDURE [HumanResources].[uspRecordAbsence]
    @EmployeeID INT,
    @AbsenceType NCHAR(1),
    @StartDate DATETIME,
    @EndDate DATETIME
    AS
    BEGIN
    BEGIN TRANSACTION
    INSERT INTO [AbsenceHistory] (EmployeeID, BeginDate, EndDate, AbsenceType)
    VALUES(@EmployeeID, @StartDate, @EndDate, @AbsenceType)
    IF (@AbsenceType = 'V')
    BEGIN
    UPDATE [Employee]
    SET [VacationHours] = [VacationHours] - DateDiff(day, @StartDate, @EndDate)
    WHERE [BusinessEntityID] = @EmployeeID
    END
    COMMIT TRANSACTION
    END;
    

    Este código define un procedimiento almacenado que agrega una fila a la tabla AbsenceHistory y actualiza el campo VacationHours de la tabla Employee si el tipo de ausencia es 'V'.

  5. En el menú Archivo, haga clic en Guardar dbo.uspRecordAbsence.proc.sql.

    En el procedimiento siguiente, se ocupará de los comentarios que reciba en una revisión del código.

Ocuparse de los comentarios de revisión del código

Al revisar su código con otro miembro del equipo, ha recibido comentarios sobre varios procedimientos recomendados. Se le ha pedido que evite el uso de SELECT *, porque genera advertencias si se ejecuta un análisis de código estático en el código de su base de datos. Además, se le ha pedido que complete los nombres que utilizó en el procedimiento almacenado. Por último, se le ha pedido que cambie el nombre de la columna BeginDate de la tabla AbsenceHistory por StartDate.

Nota

Los estándares y los requisitos de código varían entre unos equipos y otros. Debería aplicar los estándares de código de su organización al código Transact-SQL que escribe. Este tutorial muestra dos problemas. Además, normalmente aplicaría estas técnicas a todo código nuevo (por ejemplo, completando todos los nombres del nuevo código), no solo a un único objeto de base de datos.

Una vez más, implementar estos tipos de cambios puede ser tedioso y puede dar lugar a errores. Puede utilizar la refactorización con rapidez y facilidad para actualizar su base de datos y comprobar su código y los planes de generación de datos.

Para expandir SELECT* en la definición de la vista

  1. En la Vista de esquema, haga doble clic en la vista vEmployeeAbsenceHistory.

    Se abre el editor de Transact-SQL, que muestra la definición de la vista.

  2. En el menú Datos, elija Refactorizar y, a continuación, haga clic en Expandir comodines.

    Aparece el cuadro de diálogo Vista previa de los cambios.

  3. En la lista Expandir comodines, haga clic en a.*.

    El recuadro Vista previa de los cambios muestra las actualizaciones que se aplicarán a la vista.

  4. Haga clic en Aplicar.

    Los cambios se aplican a su proyecto de base de datos. A continuación completará los nombres del procedimiento almacenado que definió en un procedimiento anterior de este tutorial.

Para completar los nombres del procedimiento almacenado

  1. En la Vista de esquema, haga doble clic en el procedimiento almacenado uspRecordAbsence.

    Se abre el editor de Transact-SQL, que muestra la definición del procedimiento almacenado.

  2. En el menú Datos, elija Refactorizar y, después, haga clic en Nombres completos.

    Aparece el cuadro de diálogo Vista previa de los cambios, que muestra todas las modificaciones que se realizarán si aplica la operación de refactorización a su proyecto.

  3. Después de revisar los cambios, haga clic en Aplicar.

    Los cambios se aplican a su proyecto de base de datos.

Para cambiarle el nombre a la columna BeginDate

  1. En la Vista de esquema, expanda la tabla AbsenceHistory, el nodo Columnas y haga clic en la columna BeginDate.

  2. En el menú Datos, elija Refactorizary, después, haga clic en Cambiar nombre.

    Aparece el cuadro de diálogo Cambiar nombre.

    Nota

    También puede hacer clic con el botón secundario en BeginDate en la Vista de esquema, elegir Refactorizar y, a continuación, hacer clic en Cambiar nombre.

  3. En Nuevo nombre, escriba StartDate.

  4. Active la casilla Vista previa de los cambios y haga clic en Aceptar.

    Aparece el cuadro de diálogo Vista previa de los cambios, que muestra todas las modificaciones que se realizarán si aplica la operación de cambio de nombre a su base de datos.

  5. Haga clic en Aplicar.

    Se realizarán los cambios. El nombre de columna se actualizará y el nuevo aparecerá en la Vista de esquema para cada objeto actualizado. Si abre la definición de la restricción de fecha especificada anteriormente en este tema, la restricción también se ha actualizado para hacer referencia al nuevo nombre de la columna.

Pasos siguientes

En este punto, normalmente revisaría las actualizaciones con el miembro del equipo que realizó la revisión del código y, a continuación, protegería sus cambios en el control de versiones. En este punto, ha actualizado su proyecto de base de datos, la representación sin conexión de su esquema de base de datos. Debe implementar ese proyecto de base de datos en una base de datos de destino para actualizar el esquema implementado.

Al aplicar una operación de refactorización a su proyecto de base de datos, se registra información sobre esa operación en un archivo de registro de refactorización siempre que pueda cambiar el nombre del objeto o moverlo mediante sp_rename o ALTER. En este tutorial, el archivo de registro se denomina RefactorAdventureWorks.refactorlog. El archivo de registro de refactorización se usa en el momento de la implementación para intentar conservar la intención de sus cambios de refactorización. Por ejemplo, el registro de refactorización registrará sus cambios si cambia el nombre de una columna. En el momento de la implementación, esa información evita que la columna con el nombre anterior y los datos que contiene se quiten, y se cree una columna vacía con un nuevo nombre. Si utiliza la refactorización, no tiene que agregar las instrucciones a los scripts anteriores y posteriores a la implementación para conservar los datos.

Vea también

Tareas

Cómo: Implementar cambios de refactorización en bases de datos

Conceptos

Mover un objeto de base de datos a un esquema diferente

Completar los nombres de los objetos de base de datos

Expandir caracteres comodín en instrucciones SELECT

Analizar el código de base de datos para mejorar la calidad del código