Che cosa sono i progetti di database SQL?

Si applica a: SQL Server 2022 (16.x) Database Azure SQL Istanza gestita di SQL di Azure

Un progetto di database SQL è una rappresentazione locale degli oggetti SQL che costituiscono lo schema di un database singolo, ad esempio tabelle, stored procedure o funzioni. Il ciclo di sviluppo di un progetto di database SQL consente di integrare lo sviluppo di database in flussi di lavoro di integrazione continua e distribuzione continua (CI/CD), noto come procedura consigliata per lo sviluppo.

Panoramica

I progetti SQL sono basati su istruzioni T-SQL dichiarative. Nel codice del progetto di database SQL creare ogni oggetto una sola volta. Se necessario, modificare un elemento relativo a tale oggetto, ad esempio l'aggiunta di colonne o la modifica di un tipo di dati, modificare il file singolare che dichiara l'oggetto per la prima volta e solo per la prima volta.

Quando viene compilato un progetto di database SQL, l'artefatto di output è un file .dacpac. È possibile aggiornare i database nuovi ed esistenti in modo che corrispondano al contenuto di .dacpac pubblicando .dacpac in un database di destinazione.

Il framework di progetti di database SQL intorno al codice del database che aggiunge due funzionalità di base a tale insieme di file con il relativo processo di compilazione:

  • convalida dei riferimenti tra oggetti e sintassi rispetto a una versione specifica di SQL
  • distribuzione dell'artefatto di compilazione in database nuovi o esistenti

Screenshot del riepilogo dei progetti di database SQL contenenti script di pre-distribuzione e post-distribuzione, nonché oggetti di database.

La funzionalità per i progetti di database SQL è fornita dalla libreria .NET di Microsoft.SqlServer.DacFx ed è disponibile in diversi strumenti per lo sviluppo di SQL. DacFx include più punti di estendibilità, ad esempio la modifica dei passaggi di distribuzione e la possibilità di creare regole personalizzate per l'analisi del codice. Il progetto SDK per i progetti SQL è Microsoft.Build.Sql, attualmente disponibile in anteprima e consigliato per il nuovo sviluppo.

Convalida

Quando viene compilato un progetto SQL, le relazioni tra gli oggetti vengono convalidate. Ad esempio, una definizione di una visualizzazione non può contenere una tabella o colonne che non esistono nel progetto SQL.

Inoltre, un progetto SQL contiene una proprietà nel file .sqlproj denominata "piattaforma di destinazione". Queste informazioni vengono usate durante il processo di compilazione per verificare che le funzioni e la sintassi T-SQL esistano in tale versione di SQL. Ad esempio, le funzioni JSON aggiunte in SQL Server 2022 non possono essere usate in un progetto SQL impostato sulla piattaforma di destinazione Sql140 (SQL Server 2017).

Per compilare un progetto SQL, eseguire dotnet build dalla riga di comando. Negli strumenti grafici che supportano progetti SQL (Azure Data Studio, VS Code e Visual Studio), è disponibile una voce di menu per compilare il progetto SQL.

L'output della console del processo di compilazione potrebbe contenere errori (errore di compilazione) o avvisi. Gli avvisi di compilazione possono includere maiuscole e minuscole incoerenti nei nomi degli oggetti e in altre procedure consigliate personalizzabili, ma non interrompono la compilazione.

L'output dell'artefatto del processo di compilazione è un file .dacpac, disponibile per una compilazione con impostazioni predefinite nella cartella bin/Debug.

Distribuzione

Il file di output, .dacpac, è potente, riutilizzabile e artefatto dichiarativo. Con questo file è possibile usare SqlPackage o altri strumenti per applicare il codice del database a un database. Il comando SqlPackage per implementare un .dacpac è il comando publish.

Screenshot della panoramica del processo dalla compilazione del progetto SQL a dacpac e distribuzione nel database.

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

Nuovo database

SqlPackage sposta le relazioni tra gli oggetti per creare ogni oggetto nell'ordine corretto durante la pubblicazione di un dacpac in un nuovo database. Ad esempio, SqlPackage crea Table_A prima di Table_B quando Table_B ha una chiave esterna per Table_A.

Non si vuole eseguire un'intera cartella di script SQL, soprattutto quando è possibile usare progetti SQL che eseguono automaticamente ogni sezione T-SQL nell'ordine corretto in base alle relazioni tra oggetti.

Database esistenti

Oltre a spostarsi nella gerarchia di oggetti durante la pubblicazione in nuovi database, il processo di pubblicazione .dacpac calcola anche la differenza tra un .dacpac di origine e un database di destinazione prima di determinare i passaggi da eseguire per aggiornare il database. Ad esempio, se a Table_C mancano due colonne nel database in cui è presente nel progetto SQL e StoredProcedure_A è stato modificato, SqlPackage crea un'istruzione ALTER TABLE e un'istruzione ALTER PROCEDURE invece di tentare di creare una serie di oggetti.

Screenshot di esempio istruzione modifica della tabella calcolata dalla distribuzione.

La flessibilità offerta dal comando di pubblicazione nei database esistenti non è limitata a un singolo database. Una .dacpac può essere implementata più volte, ad esempio quando si aggiorna una flotta di cento database.

Quando utilizzare

I progetti di database SQL sono ideali per i team che vogliono integrare lo sviluppo di database in un flusso di lavoro CI/CD. La natura dichiarativa dei progetti SQL consente una singola origine di verità per lo schema del database e il processo di compilazione e pubblicazione offre un modo ripetibile e affidabile per distribuire le modifiche ai database.

I progetti di database SQL vengono usati per tenere traccia dell'origine della verità per lo stato del database, incluso lo sviluppo con un mapper relazionale di oggetti (ORM, object-relational mapper), ad esempio EF Core. È possibile usare uno strumento grafico o la riga di comando per estrarre lo schema di un database in un progetto SQL, indipendentemente dall'ORM usato per creare il database.

Screenshot di VS Code con il progetto SQL AdventureWorks aperto, che mostra una tabella nell'editor.

I progetti di database SQL supportano la famiglia di database SQL Server e Azure SQL, tra cui database SQL di Azure e Azure Synapse Analytics. Sia che si stia sviluppando un'applicazione o un data warehouse, i progetti di database SQL possono essere usati per gestire lo schema del database. I progetti SQL possono essere sviluppati da strumenti in Visual Studio, VS Code e Azure Data Studio.

Progetti originali e progetti in stile SDK (anteprima)

Il formato originale del progetto SQL si basa su MSBuild (.NET Framework) ed è il formato usato da SQL Server Data Tools in Visual Studio. Il formato di progetto in stile SDK si basa sui nuovi progetti SDK introdotti in .NET Core ed è il formato usato dall'estensione database SQL Projects per Azure Data Studio e VS Code. Il supporto per i progetti SQL in stile SDK in Visual Studio è disponibile nella roadmap.

Il nuovo lavoro di sviluppo dovrebbe prendere in considerazione l'uso del formato di progetto in stile SDK, perché è il formato che verrà supportato in futuro. Il formato del progetto in stile SDK è più flessibile e contiene nuove funzionalità non disponibili con i progetti SQL originali:

  • Supporto di .NET 8 (multipiattaforma)
  • Riferimenti ai pacchetti NuGet per i riferimenti al database
  • Modello di glob predefinito per i file .sql nel progetto

I progetti in stile SDK hanno un superset di funzionalità dei progetti SQL originali e i progetti SQL esistenti possono essere convertiti in progetti in stile SDK tramite la modifica del file di progetto. L'eccezione alla copertura delle funzionalità è il supporto per gli oggetti SQLCLR, che richiedono .NET Framework e non sono supportati nei progetti in stile SDK.