Was sind SQL-Datenbankprojekte?

Gilt für: SQL Server 2022 (16.x) Azure SQL-Datenbank Azure SQL Managed Instance

Ein SQL-Datenbankprojekt ist eine lokale Darstellung von SQL-Objekten, die das Schema einer einzelnen Datenbank umfassen, z. B. Tabellen, gespeicherte Prozeduren oder Funktionen. Der Entwicklungszyklus eines SQL-Datenbankprojekts ermöglicht es, die Datenbankentwicklung in die Workflows fortlaufende Integration und kontinuierliche Bereitstellung (CI/CD) zu integrieren, die als bewährte Methode für die Entwicklung vertraut sind.

Übersicht

SQL-Projekte basieren auf deklarativen T-SQL-Anweisungen. In Ihrem SQL-Datenbankprojektcode erstellen Sie jedes Objekt einmal. Wenn Sie etwas zu diesem Objekt ändern müssen, z. B. das Hinzufügen von Spalten oder das Ändern eines Datentyps, ändern Sie die Singulardatei, die das Objekt zum ersten und einzigen Mal deklariert.

Wenn ein SQL-Datenbank-Projekt erstellt wird, ist das Ausgabeartefakt eine .dacpac-Datei. Neue und vorhandene Datenbanken können so aktualisiert werden, dass sie mit dem Inhalt von .dacpac durch Veröffentlichen von .dacpac in eine Zieldatenbank übereinstimmen.

Das SQL-Datenbankprojekt-Framework um Ihren Datenbankcode, der zwei grundlegende Funktionen zu dieser Gruppe von Dateien mit seinem Build-Prozess hinzufügt:

  • Überprüfung von Verweisen zwischen Objekten und der Syntax auf eine bestimmte Version von SQL
  • Bereitstellung des Buildartefakts in neuen oder vorhandenen Datenbanken

Screenshot: Zusammenfassung von „SQL-Datenbank-Projekte“ mit Skripts vor und nach der Bereitstellung sowie Datenbankobjekten.

Die Funktionalität für SQL-Datenbankprojekte wird von der Microsoft.SqlServer.DacFx-.Net-Library bereitgestellt und in mehreren Tools für die SQL-Entwicklung angezeigt. DacFx verfügt über mehrere Erweiterbarkeitspunkte, z. B. Änderungen der Bereitstellungsschritte und die Möglichkeit, benutzerdefinierte Regeln für die Codeanalyse zu erstellen. Das Project SDK für SQL-Projekte ist Microsoft.Build.Sql, derzeit in der Vorschau verfügbar und empfohlen für die neue Entwicklung.

Überprüfen

Wenn ein SQL-Projekt erstellt wird, werden die Beziehungen zwischen Objekten überprüft. Eine Ansichtsdefinition kann z. B. keine Tabelle oder Spalten enthalten, die im SQL-Projekt nicht vorhanden sind.

Darüber hinaus enthält ein SQL-Projekt eine Eigenschaft in der .sqlproj-Datei namens Zielplattform. Diese Informationen werden während des Build-Prozesses verwendet, um zu überprüfen, ob die Funktionen und die T-SQL-Syntax in dieser Version von SQL vorhanden sind. Beispielsweise können die in SQL Server 2022 hinzugefügten JSON-Funktionen nicht in einem SQL-Projekt verwendet werden, das auf die Sql140-Zielplattform (SQL Server 2017) festgelegt ist.

Zum Erstellen eines SQL-Projekts führen wir den Dotnet-Build über die Befehlszeile aus. In grafischen Tools, die SQL-Projekte unterstützen (Azure Data Studio, VS Code und Visual Studio), gibt es ein Menüelement zum Erstellen des SQL-Projekts.

Die Konsolenausgabe des Build-Prozesses kann Fehler (Build-Fehler) oder Warnungen enthalten. Build-Warnungen können inkonsistente Groß-/Kleinschreibung in Objektnamen und andere anpassbare bewährte Methoden enthalten, aber der Build schlägt nicht fehl.

Die Artefaktausgabe des Build-Prozesses ist eine .dacpac-Datei, die für einen Build mit Standardeinstellungen im bin/Debug-Ordner gefunden werden kann.

Bereitstellung

Die Ausgabedatei, die .dacpac, ist ein leistungsfähiges, wiederverwendbares und deklaratives Artefakt. Mit dieser Datei können wir SqlPackage oder andere Tools verwenden, um unseren Datenbankcode auf eine Datenbank anzuwenden. Der SqlPackage-Befehl zum Bereitstellen eines .dacpac ist der Befehl Veröffentlichen.

Screenshot der Übersicht über den Prozess von SQL-Projekt-Build zu dacpac und Bereitstellung in der Datenbank.

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

Neue Datenbanken

SqlPackage navigiert in den Objektbeziehungen, um jedes Objekt in der richtigen Reihenfolge zu erstellen, wenn ein dacpac in einer neuen Datenbank veröffentlicht wird. Beispielsweise erstellt SqlPackage Table_A vor Table_B, wenn Table_B über einen Fremdschlüssel zum Table_A verfügt.

Sie sollten keinen ganzen Ordner mit SQL-Skripts ausführen, insbesondere wenn Sie SQL-Projekte verwenden können, die automatisch jeden T-SQL-Abschnitt in der richtigen Reihenfolge basierend auf Objektbeziehungen ausführen.

Vorhandene Datenbanken

Neben der Navigation in der Objekthierarchie beim Veröffentlichen in neuen Datenbanken berechnet der .dacpac-Veröffentlichungsprozess auch den Unterschied zwischen einer Quell-.dacpac und einer Zieldatenbank, bevor ermittelt wird, welche Schritte zum Aktualisieren dieser Datenbank erforderlich sind. Wenn z. B. Table_C zwei Spalten in der Datenbank fehlen, die im SQL-Projekt vorhanden sind und StoredProcedure_A geändert wurde, erstellt SqlPackage eine ALTER TABLE-Anweisung und eine ALTER PROCEDURE-Anweisung, anstatt blind zu versuchen, eine Reihe von Objekten zu erstellen.

Screenshot der beispielbasierten Änderungstabellen-Anweisung, die von der Bereitstellung berechnet wird.

Die Flexibilität des Befehls zum Veröffentlichen in vorhandenen Datenbanken ist nicht auf eine einzelne Datenbank beschränkt. Eine .dacpac kann mehrmals bereitgestellt werden, z. B. beim Upgrade einer Flotte von hundert Datenbanken.

Einsatzgebiete

SQL-Datenbankprojekte eignen sich hervorragend für Teams, die die Datenbankentwicklung in einen CI/CD-Workflow integrieren möchten. Die deklarative Natur von SQL-Projekten ermöglicht eine Single Source of Truth für das Datenbankschema, und der Build- und Veröffentlichungsprozess bieten eine wiederholbare und zuverlässige Möglichkeit, Änderungen an Datenbanken bereitzustellen.

SQL-Datenbankprojekte werden verwendet, um die Source of Truth für den Datenbankzustand nachzuverfolgen, einschließlich der Entwicklung mit einem objektrelationalen Mapper (ORM) wie EF Core. Entweder ein grafisches Tool oder die Befehlszeile kann verwendet werden, um das Schema einer Datenbank in ein SQL-Projekt zu extrahieren, unabhängig von dem ORM, der zum Erstellen der Datenbank verwendet wird.

Screenshot von VS Code mit geöffnetem AdventureWorks SQL-Projekt, in dem eine Tabelle im Editor angezeigt wird.

SQL-Datenbankprojekte unterstützen die SQL Server- und Azure SQL-Datenbankfamilie, einschließlich Azure SQL-Datenbank und Azure Synapse Analytics. Unabhängig davon, ob Sie eine Anwendung oder ein Data Warehouse entwickeln, können SQL-Datenbankprojekte verwendet werden, um das Schema Ihrer Datenbank zu verwalten. SQL-Projekte können aus Tools in Visual Studio, VS Code und Azure Data Studio entwickelt werden.

Originalprojekte vs SDK-Formatprojekte (Vorschau)

Das ursprüngliche SQL-Projektformat basiert auf MSBuild (.NET Framework) und ist das Format, das von SQL Server Data Tools in Visual Studio verwendet wird. Das Projektformat im SDK-Stil basiert auf den neuen in .NET Core eingeführten SDK-Formatprojekten und ist das Format, das von der Erweiterung „SQL Database Projects“ für Azure Data Studio und VS Code verwendet wird. Die Unterstützung für SQL-Projekte im SDK-Stil in Visual Studio befindet sich in der Roadmap.

Neue Entwicklungsarbeiten sollten die Verwendung des SDK-Stil-Projektformats in Betracht ziehen, da es sich um das Format handelt, das in Zukunft unterstützt wird. Das Projektformat im SDK-Stil ist flexibler und enthält neue Features, die mit den ursprünglichen SQL-Projekten nicht verfügbar sind:

  • .NET 8-Unterstützung (plattformübergreifend)
  • NuGet-Paketverweise für Datenbankverweise
  • Standard-Globbingmuster für .sql-Dateien im Projekt

SDK-Stilprojekte verfügen über eine Obermenge von Funktionen aus ursprünglichen SQL-Projekten, und vorhandene SQL-Projekte können durch Änderung der Projektdatei in SDK-Formatprojekte konvertiert werden. Die Ausnahme von der Funktionalitätsabdeckung ist die Unterstützung für SQLCLR-Objekte, die .NET Framework erfordern und in SDK-Formatprojekten nicht unterstützt werden.