Distribuzione di progetti di database
di Jason Lee
Nota
In molti scenari di distribuzione aziendali è necessaria la possibilità di pubblicare aggiornamenti incrementali in un database distribuito. L'alternativa consiste nel ricreare il database in ogni distribuzione, ovvero si perdono dati nel database esistente. Quando si usa Visual Studio 2010, l'uso di VSDBCMD è l'approccio consigliato per la pubblicazione incrementale del database. Tuttavia, la versione successiva di Visual Studio e la pipeline di pubblicazione Web (WPP) includeranno strumenti che supportano direttamente la pubblicazione incrementale.
Se si apre la soluzione di esempio Contact Manager in Visual Studio 2010, si noterà che il progetto di database include una cartella Properties contenente quattro file.
Insieme al file di progetto (ContactManager.Database.dbproj in questo caso), questi file controllano vari aspetti del processo di compilazione e distribuzione:
- Il file Database.sqlcmdvars fornisce valori per le variabili SQLCMD usate durante la distribuzione del progetto. Ogni configurazione della soluzione (ad esempio, debug e versione) può specificare un file con estensione sqlcmdvars diverso.
- Il file Database.sqldeployment fornisce impostazioni specifiche della distribuzione, ad esempio se usare le regole di confronto definite nel progetto o le regole di confronto del server di destinazione, se ricreare il database di destinazione ogni volta o semplicemente modificare il database esistente per aggiornarlo e così via. Ogni configurazione della soluzione può specificare un file con estensione sqldeployment diverso.
- Il file Database.sqlpermissions è un documento XML che è possibile usare per definire le autorizzazioni da aggiungere al database di destinazione. Tutte le configurazioni della soluzione condividono lo stesso file con estensione sqlpermissions.
- Il file Database.sqlsettings specifica le proprietà a livello di database da utilizzare durante la creazione del database, ad esempio le regole di confronto da usare, il comportamento degli operatori di confronto e così via. Tutte le configurazioni della soluzione condividono lo stesso file con estensione sqlsettings.
Vale la pena dedicare qualche minuto ad aprire questi file in Visual Studio e acquisire familiarità con il contenuto.
Quando si compila un progetto di database, il processo di compilazione crea due file:
- Schema del database (file con estensione dbschema). In questo modo viene descritto lo schema del database che si desidera creare in formato XML.
- Manifesto della distribuzione (file con estensione deploymanifest). Contiene tutte le informazioni necessarie per creare e distribuire il database. Fa riferimento al file con estensione dbschema insieme ad altre risorse, ad esempio le istruzioni di distribuzione (il file con estensione sqldeployment) e qualsiasi script SQL pre-distribuzione o post-distribuzione.
In questo modo viene illustrata la relazione tra queste risorse:
Come si può notare, il file con estensione sqlsettings e il file con estensione sqlpermissions sono input per il processo di compilazione. Insieme al file di progetto di database, questi file vengono usati per creare il file dello schema del database. Il file con estensione sqldeployment e il file con estensione sqlcmdvars passano attraverso il processo di compilazione invariato. Il manifesto della distribuzione indica il percorso dello schema del database, il file con estensione sqldeployment, il file con estensione sqlcmdvars e qualsiasi script SQL pre-distribuzione o post-distribuzione.
Perché usare VSDBCMD per distribuire un progetto di database?
Esistono diversi approcci per la distribuzione di progetti di database. Tuttavia, non tutti sono adatti per la distribuzione di un progetto di database in server remoti in un ambiente aziendale. Prendere in considerazione ciò che si desidera dalla distribuzione di un progetto di database. Negli scenari di distribuzione aziendali è probabile che si voglia:
- Possibilità di distribuire il progetto di database da una posizione remota.
- Possibilità di apportare aggiornamenti incrementali a un database esistente.
- Possibilità di includere script di pre-distribuzione o script post-distribuzione.
- Possibilità di personalizzare la distribuzione in più ambienti di destinazione.
- Possibilità di distribuire il progetto di database come parte di una distribuzione di soluzioni in più grandi, in genere con scripting singolo.
Esistono tre approcci principali che è possibile usare per distribuire un progetto di database:
- È possibile usare la funzionalità di distribuzione con il tipo di progetto di database in Visual Studio 2010. Quando si compila e si distribuisce un progetto di database in Visual Studio 2010, il processo di distribuzione usa il manifesto della distribuzione per generare un file di distribuzione basato su SQL specifico per la configurazione di compilazione. Verrà creato il database se non esiste già o verranno apportate modifiche necessarie al database, se esiste già. È possibile usare SQLCMD.exe per eseguire questo file nel server di destinazione oppure impostare Visual Studio per creare ed eseguire il file. Lo svantaggio di questo approccio è che si ha solo un controllo limitato sulle impostazioni di distribuzione. Spesso può anche essere necessario modificare il file di distribuzione SQL per fornire valori di variabile specifici dell'ambiente. È possibile usare questo approccio solo da un computer con Visual Studio 2010 installato e lo sviluppatore dovrà conoscere e fornire stringa di connessione e credenziali per tutti gli ambienti di destinazione.
- È possibile usare lo strumento di distribuzione Web IIS (Internet Information Services) (Distribuzione Web) per distribuire un database come parte di un progetto di applicazione Web. Tuttavia, questo approccio è molto più complesso se si vuole distribuire un progetto di database anziché semplicemente replicare un database locale esistente in un server di destinazione. È possibile configurare Distribuzione Web per eseguire lo script di distribuzione SQL generato dal progetto di database, ma a tale scopo, è necessario creare un file di destinazioni WPP personalizzato per il progetto di applicazione Web. Ciò aggiunge una notevole complessità al processo di distribuzione. Inoltre, Distribuzione Web non supporta direttamente gli aggiornamenti incrementali ai database esistenti. Per altre informazioni su questo approccio, vedere Estensione della pipeline di pubblicazione Web al file SQL distribuito nel progetto di database del pacchetto.
- È possibile usare l'utilità VSDBCMD per distribuire il database usando lo schema del database o il manifesto della distribuzione. È possibile chiamare VSDBCMD.exe da una destinazione MSBuild, che consente di pubblicare database come parte di un processo di distribuzione con script più grande. È possibile eseguire l'override delle variabili nel file con estensione sqlcmdvars e molte altre proprietà del database da un comando VSDBCMD, che consente di personalizzare la distribuzione per ambienti diversi senza creare più configurazioni di compilazione. VSDBCMD offre funzionalità di differenziazione, il che significa che apporta solo le modifiche necessarie per allineare un database di destinazione allo schema del database. VSDBCMD offre anche un'ampia gamma di opzioni della riga di comando, che offrono un controllo granulare sul processo di distribuzione.
Da questa panoramica è possibile notare che l'uso di VSDBCMD con MSBuild è l'approccio più adatto a uno scenario di distribuzione aziendale tipico:
Supporti | Visual Studio 2010 | Web Deploy 2.0 | VSDBCMD.exe |
---|---|---|---|
Supporta la distribuzione remota? | Sì | Sì | Sì |
Supporta gli aggiornamenti incrementali? | Sì | No | Sì |
Supporta gli script pre/post-distribuzione? | Sì | Sì | Sì |
Supporta la distribuzione in più ambienti? | Limitata | Limitata | Sì |
Supporta la distribuzione con script? | Limitata | Sì | Sì |
Nella parte restante di questo argomento viene descritto l'uso di VSDBCMD con MSBuild per distribuire progetti di database.
Informazioni sul processo di distribuzione
L'utilità VSDBCMD consente di distribuire un database usando lo schema del database (il file dbschema) o il manifesto della distribuzione (file con estensione deploymanifest). In pratica, si userà quasi sempre il manifesto della distribuzione, poiché il manifesto della distribuzione consente di fornire valori predefiniti per varie proprietà di distribuzione e identificare eventuali script SQL pre-distribuzione o post-distribuzione da eseguire. Ad esempio, questo comando VSDBCMD viene usato per distribuire il database ContactManager in un server di database in un ambiente di test:
vsdbcmd.exe /a:Deploy
/manifest:"…\ContactManager.Database.deploymanifest"
/cs:"Data Source=TESTDB1;Integrated Security=true"
/p:TargetDatabase=ContactManager
/dd+
/script:"…\Publish-ContactManager-Db.sql"
In questo caso:
- L'opzione /a (o /Action) specifica le operazioni da eseguire in VSDBCMD. È possibile impostare questa opzione su Importa o Distribuisci. L'opzione Import viene usata per generare un file con estensione dbschema da un database esistente e l'opzione Distribuisci viene usata per distribuire un file con estensione dbschema in un database di destinazione.
- L'opzione /manifest (o /ManifestFile) identifica il file con estensione deploymanifest da distribuire. Se invece si vuole usare il file con estensione dbschema, si userà l'opzione /model (o /ModelFile).
- L'opzione /cs (o /ConnectionString) fornisce il stringa di connessione per il server di database di destinazione. Si noti che questo non include il nome del database: VSDBCMD deve connettersi al server per creare il database; non è necessario connettersi a un singolo database. Se il file con estensione deploymanifest include un stringa di connessione, è possibile omettere questa opzione. Se si usa comunque l'opzione, il valore switch sostituirà il valore .deploymanifest.
- La proprietà /p:TargetDatabase fornisce il nome da assegnare al database di destinazione al termine della creazione. In questo modo viene eseguito l'override del valore della proprietà TargetDatabase nel file con estensione deploymanifest. È possibile usare la sintassi /p: [nome proprietà]per impostare un'ampia gamma di proprietà di distribuzione e per eseguire l'override di qualsiasi variabile SQLCMD dichiarata nel file con estensione sqlcmdvars.
- L'opzione /dd+ (o /DeployToDatabase+) indica che si vuole creare una distribuzione e distribuirla nell'ambiente di destinazione. Se si specifica /dd-o si omette l'opzione, VSDBCMD genererà uno script di distribuzione ma non lo distribuirà nell'ambiente di destinazione. Questa opzione è spesso la fonte di confusione e viene illustrata in modo più dettagliato nella sezione successiva.
- L'opzione /script (o /DeploymentScriptFile) specifica dove si vuole generare lo script di distribuzione. Questo valore non influisce sul processo di distribuzione.
Per altre informazioni su VSDBCMD, vedere Informazioni di riferimento sulla riga di comando per VSDBCMD.EXE (distribuzione e importazione dello schema) e Procedura: Preparare un database per la distribuzione da un prompt dei comandi tramite VSDBCMD.EXE.
Per un esempio di come usare VSDBCMD da un file di progetto MSBuild, vedere Informazioni sul processo di compilazione. Per esempi di come configurare le impostazioni di distribuzione del database per più ambienti, vedere Personalizzazione delle distribuzioni di database per più ambienti.
Informazioni sull'opzione DeployToDatabase
Il comportamento dell'opzione /dd o /DeployToDatabase dipende dal fatto che si usi VSDBCMD con un file con estensione dbschema o un file con estensione deploymanifest. Se si usa un file con estensione dbschema, il comportamento è piuttosto semplice:
- Se si specifica /dd+ o /dd, VSDBCMD genererà uno script di distribuzione e distribuirà il database.
- Se si specifica /dd- o si omette l'opzione, VSDBCMD genererà solo uno script di distribuzione.
Se si usa un file con estensione deploymanifest, il comportamento è molto più complesso. Questo perché il file con estensione deploymanifest contiene un nome di proprietà DeployToDatabase che determina anche se il database viene distribuito.
<DeployToDatabase>False</DeployToDatabase>
Il valore di questa proprietà viene impostato in base alle proprietà del progetto di database. Se si imposta l'azione Distribuisci su Crea uno script di distribuzione (.sql), il valore sarà False. Se si imposta l'azione Distribuisci su Crea uno script di distribuzione (.sql) e si distribuisce nel database, il valore sarà True.
Nota
Queste impostazioni sono associate a una configurazione e a una piattaforma di compilazione specifiche. Ad esempio, se si configurano le impostazioni per la configurazione di debug e quindi si pubblica usando la configurazione versione , le impostazioni non verranno usate.
Nota
In questo scenario, l'azione Distribuisci deve essere sempre impostata su Crea uno script di distribuzione (.sql) perché non si vuole che Visual Studio 2010 distribuisca il database. In altre parole, la proprietà DeployToDatabase deve essere sempre False.
Quando si specifica una proprietà DeployToDatabase , l'opzione /dd eseguirà l'override della proprietà solo se il valore della proprietà è false:
- Se la proprietà DeployToDatabase è False e si specifica /dd+ o /dd, VSDBCMD eseguirà l'override della proprietà DeployToDatabase e distribuirà il database.
- Se la proprietà DeployToDatabase è False e si specifica /dd- o si omette l'opzione, VSDBCMD non distribuirà il database.
- Se la proprietà DeployToDatabase è True, VSDBCMD ignorerà l'opzione e distribuirà il database.
- In ogni caso viene generato uno script di distribuzione, indipendentemente dal fatto che si stia distribuendo anche il database.
Conclusione
Questo argomento ha fornito una panoramica del processo di compilazione e distribuzione per i progetti di database in Visual Studio 2010. Descrive anche come usare VSDBCMD.exe con MSBuild per supportare la distribuzione di database su scala aziendale.
Per altre informazioni sul funzionamento di questa procedura, vedere Personalizzazione delle distribuzioni di database per più ambienti.
Altre informazioni
Per informazioni su come personalizzare le distribuzioni di database creando un file di configurazione della distribuzione separato per ogni ambiente, vedere Personalizzazione delle distribuzioni di database per più ambienti. Per indicazioni su come configurare le appartenenze ai ruoli del database eseguendo uno script di post-distribuzione, vedere Distribuzione di appartenenze ai ruoli del database in ambienti di test. Per indicazioni sulla gestione di alcune delle sfide specifiche imposte dai database di appartenenza, vedere Distribuzione di database di appartenenza in ambienti aziendali.
Questi argomenti su MSDN forniscono indicazioni e informazioni generali più generali sui progetti di database di Visual Studio e sul processo di distribuzione del database: