Cómo reordenar scripts para evitar errores basados en dependencias

Tener una base de datos codificada a una carpeta de script o a un control de fuente permite usar estos scripts DDL para recrearla. De todos modos, puede que no vaya todo tan bien debido a algunas dependencias perdidas.

Cuando se crea un objeto de base de datos desde cero, los objetos necesarios son creados sobre la marcha. Los objetos que pueden estar atados en relaciones y restricciones que los hacen dependientes uno del otro.

Crear objetos de scripts existentes es un poco diferente. La estructura de la base de datos no es conocida, junto con sus dependencias y restricciones. Si una tabla utiliza un tipo definido por el usuario que no existe en la base de datos creada, el siguiente mensaje de error se encontrará:

Msg 2715, Level 16, State 6, Line 2
Column, parameter, or variable #11: Cannot find data type dbo.Flag.

Algo similar ocurre cuando se crea un objeto de base de datos que depende de otro objeto no existente:

Msg 208, Level 16, State 1, Procedure vEmployeeDepartment, Line 8
Invalid object name 'HumanResources.Employee'.

La solución esc rear los objetos padre primero, y luego crear los objetos que los referencian.

Esto sería fácil si la base de datos sólo tuviera un par de objetos y el esquema de dependencias fuera conocido.
Desafortunadamente, esto usualmente no es el caso.

Uno de los métodos para crear objetos de base de datos por tipo es:

  1. Crear todas las tablas, llaves, desencadenadores e índices
  2. Funciones
  3. Vistas
  4. Procedimientos almacenados

¿Pero qué pasa si la vista ViewEmployee referencia a la vista ViewEmployeeHistory? La vista ViewEmployeeHistory tiene que ser creada primero. Así que el método anterior puede no siempre funcionar.

Cómo ejecutar scripts de objetos en un orden correcto

ApexSQL Build es una herramienta de despliegue de bases de datos SQL que construye nuevas bases de datos o actualiza las existentes empaquetando scripts, carpetas de scripts, instantáneas de bases de datos e incluso scripts bajo control de fuente en un solo script SQL de despliegue, una solución .NET o un instalador ejecutable. Permite especificar los objetos a ser creados o actualizados, se asegura de un despliegue libre de errores, permite ejecutar scripts SQL contra múltiples SQL Servers simultáneamente y más.

  1. Inicie ApexSQL Build
  2. En la pestaña Build, seleccione la acción Build new database:

  3. Seleccione la opción Database como un tipo de salida:

    Select Database option as an output type

  4. Seleccione el Script folder como una fuente de entradas:

  5. Haga clic en el botón Browse y seleccione la carpeta que contiene los scripts DDL para los objetos de la base de datos
  6. Especifique las propiedades para la nueva base de datos. Si las propiedades están codificadas en uno de los scripts, haga clic en el botón Get database properties from the input source:

  7. Una lista de los objetos a ser creados será mostrada. Todos ellos están seleccionados por defecto. Si algunos de ellos no son necesarios, deselecciónelos:

  8. En el paso Preview the script impact, una lista de acciones para la ejecución se mostrará. Después de revisarlos, haga clic en el botón Next para continuar:

  9. En el último paso elija si grabar una copia del nuevo script e insertar una cabecera en él:

    Si la opción Save a copy of script está elegida, el script creado puede ser revisado o modificado y re ejecutado después, directamente en SQL Server Management Studio.

  10. Haga clic en el botón Build

    El script creará una nueva base de datos y todos los objetos en ella.

Crear una base de datos desde un puñado de scripts DDL no tiene que ser un problema. ApexSQL Build provee el óptimo orden de creación de objetos de tal manera que todos los objetos sean creados exitosamente y no haya problemas con dependencias perdidas o encontradas.

Traductor: Daniel Calbimonte

noviembre 14, 2015