¿Qué son los proyectos de base de datos SQL?

Se aplica a: SQL Server 2022 (16.x) Azure SQL Database Azure SQL Managed Instance

Un proyecto de base de datos SQL es una representación local de objetos SQL que contiene el esquema de una base de datos única, como tablas, procedimientos almacenados o funciones. El ciclo de desarrollo de un proyecto de base de datos SQL permite integrar el desarrollo de bases de datos en flujos de trabajo de integración continua e implementación continua (CI/CD) conocidos como procedimiento recomendado de desarrollo.

Información general

Los proyectos SQL se basan en instrucciones T-SQL declarativas. En el código del proyecto de base de datos SQL, se crea cada objeto una vez. Si necesita cambiar algo sobre ese objeto, como agregar columnas o cambiar un tipo de datos, modifique el archivo singular que declara el objeto por primera y única vez.

Cuando se compila un proyecto de base de datos SQL, el artefacto de salida es un archivo .dacpac. Las bases de datos nuevas y existentes se pueden actualizar para que coincidan con el contenido del .dacpac mediante la publicación del .dacpac una base de datos de destino.

El marco de proyectos de base de datos SQL en torno al código de base de datos que agrega dos funcionalidades fundamentales a ese conjunto de archivos con su proceso de compilación:

  • validación de referencias entre objetos y la sintaxis en una versión específica de SQL
  • implementación del artefacto de compilación en bases de datos nuevas o existentes

Captura de pantalla del resumen de proyectos de base de datos SQL que contienen scripts previos y posteriores a la implementación, así como objetos de base de datos.

La funcionalidad de los proyectos de base de datos SQL se proporciona mediante la biblioteca .NET Microsoft.SqlServer.DacFx y se muestra en varias herramientas de desarrollo de SQL. DacFx tiene varios puntos de extensibilidad, como la modificación de los pasos de implementación y la capacidad de crear reglas personalizadas para el análisis de código. El SDK del proyecto en proyectos SQL es Microsoft.Build.Sql, que está disponible actualmente en versión preliminar y está recomendado para nuevos desarrollos.

Validation

Cuando se compila un proyecto SQL, se validan las relaciones entre objetos. Por ejemplo, una definición de vista no puede contener una tabla o columnas que no existan en el proyecto SQL.

Además, un proyecto SQL contiene una propiedad en su archivo .sqlproj denominada "plataforma de destino". Esta información se usa durante el proceso de compilación para validar que las funciones y la sintaxis de T-SQL existen en esa versión de SQL. Por ejemplo, las funciones JSON agregadas en SQL Server 2022 no se pueden usar en un proyecto SQL establecido en la plataforma de destino sql140 (SQL Server 2017).

Para compilar un proyecto SQL, ejecutamos la versión dotnet desde la línea de comandos. En herramientas gráficas que admiten proyectos SQL (Azure Data Studio, VS Code y Visual Studio), hay un elemento de menú para compilar el proyecto SQL.

La salida de la consola del proceso de compilación puede contener errores (error de compilación) o advertencias. Las advertencias de compilación pueden incluir diferencias en mayúsculas y minúsculas en los nombres de objeto y otros procedimientos recomendados personalizables, pero no producen un error en la compilación.

La salida del artefacto del proceso de compilación es un archivo .dacpac, que se puede encontrar para una compilación con la configuración predeterminada en la carpeta bin/Debug.

Implementación

El archivo de salida, .dacpac, es un artefacto eficaz, reutilizable y declarativo. Con este archivo, podemos usar SqlPackage u otras herramientas para aplicar el código de base de datos a una base de datos. El comando SqlPackage para implementar un .dacpac es el comando publish.

Captura de pantalla de información general sobre el proceso de la compilación del proyecto SQL a dacpac y la implementación en la base de datos.

Por ejemplo, sqlpackage /Action:Publish /SourceFile:yourfile.dacpac /TargetConnectionString:{yourconnectionstring}.

Nuevas bases de datos

SqlPackage navega por las relaciones de objeto para crear cada objeto en el orden correcto al publicar un dacpac en una nueva base de datos. Por ejemplo, SqlPackage crea Table_A antes que Table_B cuando Table_B tiene una clave externa para Table_A.

No le interesa ejecutar una carpeta completa de scripts SQL, especialmente cuando podría usar proyectos SQL que ejecuten automáticamente cada sección de T-SQL en el orden correcto en función de las relaciones entre los objetos.

Bases de datos existentes

Además de navegar por la jerarquía de objetos al publicar en bases de datos nuevas, el proceso de publicación .dacpac también calcula la diferencia entre un origen .dacpac y una base de datos de destino antes de determinar qué pasos debe realizar para actualizar dicha base de datos. Por ejemplo, si en Table_C faltan dos columnas en la base de datos que tiene en el proyecto SQL y StoredProcedure_A ha sido modificado, SqlPackage crea una instrucción ALTER TABLE y una instrucción ALTER PROCEDURE en lugar de intentar crear un montón de objetos de forma ciega.

Captura de pantalla de la instrucción de muestra de modificación de la tabla calculada por la implementación.

La flexibilidad proporcionada por el comando de publicación (publish) en las bases de datos existentes no se limita a una base de datos única. Se puede implementar un .dacpac varias veces, como al actualizar una flota de cien bases de datos.

Cuándo se deben usar

Los proyectos de base de datos SQL son una excelente opción para los equipos que buscan integrar el desarrollo de bases de datos en un flujo de trabajo de CI/CD. La naturaleza declarativa de los proyectos SQL permite tener una fuente única de la verdad para el esquema de la base de datos, y el proceso de compilación y publicación proporciona una manera reproducible y fiable de implementar cambios en las bases de datos.

Los proyectos de base de datos SQL se usan para realizar un seguimiento de la fuente de la verdad para el estado de la base de datos, incluido el desarrollo con un asignador relacional de objetos (ORM), como EF Core. Se puede usar una herramienta gráfica o la línea de comandos para extraer el esquema de una base de datos en un proyecto SQL, independientemente del ORM usado para crear la base de datos.

Captura de pantalla de VS Code con el proyecto SQL AdventureWorks abierto, que muestra una tabla en el editor.

Los proyectos de base de datos SQL son compatibles con la familia de bases de datos de SQL Server y Azure SQL, incluyendo Azure SQL Database y Azure Synapse Analytics. Tanto si está desarrollando una aplicación como un almacenamiento de datos, los proyectos de base de datos SQL se pueden usar para administrar el esquema de la base de datos. Los proyectos SQL se pueden desarrollar a partir de herramientas en Visual Studio, VS Code y Azure Data Studio.

Proyectos originales frente a proyectos de estilo SDK (versión preliminar)

El formato de proyecto SQL original está basado en MSBuild (.NET Framework) y es el formato usado por SQL Server Data Tools en Visual Studio. El formato de proyecto de estilo SDK está basado en los nuevos proyectos de estilo SDK introducidos en .NET Core y es el formato que usa la extensión Proyectos de base de datos SQL para Azure Data Studio y VS Code. La compatibilidad para proyectos SQL de estilo SDK en Visual Studio está en el plan de desarrollo.

El nuevo trabajo de desarrollo debe considerar el uso del formato de proyecto de estilo SDK, ya que es el formato que será compatible en el futuro. El formato de proyecto de estilo SDK es más flexible y contiene nuevas características no disponibles en los proyectos SQL originales:

  • Compatibilidad con .NET 8 (multiplataforma)
  • Referencias de paquete NuGet para referencias de base des datos
  • Patrón de globbing predeterminado para archivos .sql en el proyecto

Los proyectos de estilo SDK tienen un superconjunto de funcionalidades proveniente de los proyectos SQL originales y los proyectos SQL existentes se pueden convertir a proyectos de estilo SDK mediante la modificación del archivo de proyecto. La excepción a la cobertura de funcionalidad es la compatibilidad con objetos SQLCLR, que requieren .NET Framework y no son compatibles con los proyectos de estilo SDK.