Qu'est-ce qu'un projet de base de données SQL ?

S’applique à : SQL Server 2022 (16.x)base de données Azure SQL Azure SQL Managed Instance

Un projet de base de données SQL Database est une représentation locale d’objets SQL qui comprennent le schéma d’une base de données unique, comme des tables, des procédures stockées ou des fonctions. Le cycle de développement d'un projet de base de données SQL permet d'intégrer le développement de la base de données dans un flux de travail d'intégration et de déploiement continus (CI/CD) connu comme une meilleure pratique de développement.

Vue d’ensemble

Les projets SQL sont basés sur des instructions T-SQL déclaratives. Dans le code de votre projet de base de données SQL, vous créez chaque objet une fois. Si vous devez modifier un élément de cet objet, par exemple ajouter des colonnes ou changer un type de données, vous modifiez le fichier singulier qui déclare l'objet pour la première et unique fois.

Quand un projet de base de données SQL est généré, l’artefact de production est un fichier .dacpac. Les bases de données nouvelles et existantes peuvent être mises à jour pour correspondre au contenu du .dacpac en publiant le .dacpac dans une base de données cible.

Le projet de base de données SQL encadre le code de votre base de données et ajoute deux fonctionnalités fondamentales à cet ensemble de fichiers au cours de son processus de génération :

  • validation des références entre objets et de la syntaxe par rapport à une version spécifique de SQL
  • déploiement de l'artefact de génération dans des bases de données nouvelles ou existantes

Capture d'écran du résumé de SQL Database Projects contenant des scripts de prédéploiement et de post-déploiement, ainsi que des objets de base de données.

La fonctionnalité pour les projets de base de données SQL est fournie par la bibliothèque Microsoft.SqlServer.DacFx .NET et est présente dans plusieurs outils de développement SQL. DacFx possède de nombreux points d'extension, tels que la modification des étapes de déploiement et la possibilité de créer des règles personnalisées pour l'analyse du code. Le kit de développement logiciel (SDK) pour les projets SQL est Microsoft.Build.Sql, actuellement disponible en aperçu et conseillé pour les nouveaux développements.

Validation

Lors de la génération d'un projet SQL, les relations entre les objets sont validées. Par exemple, une définition de vue ne peut pas contenir une table ou des colonnes qui n'existent pas dans le projet SQL.

Par ailleurs, un projet SQL contient dans son fichier .sqlproj une propriété appelée « plateforme cible ». Ces informations sont utilisées au cours du processus de génération pour valider que les fonctions et la syntaxe T-SQL existent dans cette version de SQL. Par exemple, les fonctions JSON ajoutées dans SQL Server 2022 ne peuvent pas être utilisées dans un projet SQL défini sur la plateforme cible Sql140 (SQL Server 2017).

Pour générer un projet SQL, nous exécutons dotnet build à partir de la ligne de commande. Dans les outils d'image qui prennent en charge les projets SQL (Azure Data Studio, VS Code et Visual Studio), il existe un élément de menu permettant de créer le projet SQL.

La sortie de la console du processus de génération peut contenir des erreurs (échec de la génération) ou des avertissements. Les avertissements liés à la génération peuvent concerner des noms d'objets dont la casse est incohérente et d'autres meilleures pratiques personnalisables, mais ils n'entraînent pas l'échec de la génération.

L'artefact résultant du processus de génération est un fichier .dacpac, qui peut être trouvé pour une génération avec les paramètres par défaut dans le dossier bin/Debug.

Déploiement

Le fichier de sortie, le .dacpac, est un artefact puissant, réutilisable et déclaratif. Avec ce fichier, nous pouvons utiliser SqlPackage ou d'autres outils pour appliquer notre code à une base de données. La commande SqlPackage pour déployer un .dacpac est la commande ce publication.

Capture d'écran de la vue d'ensemble du processus allant de la génération du projet SQL à dacpac et au déploiement dans la base de données.

Par exemple : sqlpackage /Action:Publish /SourceFile:yourfile.dacpac /TargetConnectionString:{yourconnectionstring}.

Nouvelles bases de données

SqlPackage navigue dans les relations entre les objets pour créer chaque objet dans le bon ordre lors de la publication d'un dacpac dans une nouvelle base de données. Par exemple, SqlPackage crée la Table_A avant la Table_B lorsque la Table_B possède une clé étrangère pour la Table_A.

Vous ne voulez pas exécuter un dossier entier de scripts SQL, surtout lorsque vous pouvez utiliser des projets SQL qui exécutent automatiquement chaque section T-SQL dans le bon ordre sur la base des relations entre les objets.

Bases de données existantes

En plus de naviguer dans la hiérarchie des objets lors de la publication vers de nouvelles bases de données, le processus de publication .dacpac calcule également la différence entre une base de données source .dacpac et une base de données cible avant de déterminer les mesures à prendre pour mettre à jour cette base de données. Par exemple, s'il manque à Table_C deux colonnes dans la base de données qu'elle possède dans le projet SQL et que StoredProcedure_A a été modifiée, SqlPackage crée une instruction ALTER TABLE et une instruction ALTER PROCEDURE au lieu d'essayer de créer aveuglément un tas d'objets.

Capture d'écran d'un exemple d'instruction alter table calculée par déploiement.

La flexibilité offerte par la commande publish aux bases de données existantes n'est pas limitée à une seule base de données. Un .dacpac peut être déployé plusieurs fois, par exemple lors de la mise à niveau d'une flotte d'une centaine de bases de données.

Quand utiliser

Les projets de bases de données SQL conviennent parfaitement aux équipes qui cherchent à intégrer le développement de bases de données dans un flux de travail CI/CD. La nature déclarative des projets SQL permet d'avoir une source unique de vérité pour le schéma de la base de données, et le processus de génération et de publication fournit un moyen reproductible et fiable de déployer des changements dans les bases de données.

Les projets de base de données SQL sont utilisés pour suivre la source de vérité pour l'état de la base de données, y compris le développement avec un mappeur objet-relationnel (ORM) tel que EF Core. Un outil d’image ou une ligne de commande peut être utilisé pour extraire le schéma d’une base de données dans un projet SQL, quel que soit l’ORM utilisé pour créer la base de données.

Capture d'écran de VS Code avec le projet AdventureWorks SQL ouvert, affichant une table dans le rédacteur.

Les projets de base de données SQL prennent en charge la famille de bases de données SQL Server et Azure SQL, y compris la base de données Azure SQL et Azure Synapse Analytics. Que vous développiez une application ou un entrepôt de données, les projets de base de données SQL peuvent être utilisés pour gérer le schéma de votre base de données. Les projets SQL peuvent être développés à partir d’outils dans Visual Studio, VS Code et Azure Data Studio.

Projets d’origine et projets de style SDK (aperçu)

Le format original du projet SQL est basé sur MSBuild (.NET Framework) et est le format utilisé par SQL Server Data Tools dans Visual Studio. Le format de projet de style SDK est basé sur les nouveaux projets de style SDK introduits dans .NET Core et est le format utilisé par l'extension SQL Database Projects pour Azure Data Studio et VS Code. La prise en charge des projets SQL de style SDK dans Visual Studio est prévue dans la feuille de route.

Les nouveaux travaux de développement devraient envisager d'utiliser le format de projet de style SDK, car c'est le format qui sera pris en charge à l'avenir. Le format de projet de style SDK est plus flexible et contient de nouvelles fonctionnalités qui ne sont pas disponibles avec les projets SQL d'origine :

  • Prise en charge de .NET 8 (multiplateforme)
  • Références de packages NuGet pour les références de bases de données
  • Modèle Glob par défaut pour les fichiers .sql dans le projet

Les projets de style SDK disposent d'un surensemble de fonctionnalités par rapport aux projets SQL d'origine et les projets SQL existants peuvent être convertis en projets de style SDK en modifiant le fichier projet. L'exception à la couverture des fonctionnalités est la prise en charge des objets SQLCLR, qui nécessitent .NET Framework et ne sont pas pris en charge dans les projets de style SDK.