Come posso automatizzare l’attività “generare script” in SQL Server Management Studio 2008?

Mi piacerebbe automatizzare la generazione di script in SQL Server Management Studio 2008.

In questo momento quello che faccio è:

  • Fai clic destro sul mio database, Attività, “Genera script …”
  • seleziona manualmente tutte le opzioni di esportazione che mi servono e premi seleziona tutto nella scheda “seleziona object”
  • Seleziona la cartella di esportazione
  • Alla fine premi il pulsante “Fine”

C’è un modo per automatizzare questa attività?

Modifica: voglio generare script di creazione , non cambiare script.

Quello che Brann sta citando da Visual Studio 2008 SP1 Team Suite è la versione 1.4 della Pubblicazione guidata del database. È installato con SQL Server 2008 (forse solo professionale?) Su \ Programmi \ Microsoft SQL Server \ 90 \ Tools \ Publishing \ 1.4. La chiamata VS da server explorer sta semplicemente chiamando questo. È ansible ottenere la stessa funzionalità tramite la riga di comando come:

sqlpubwiz help script 

Non so se la v1.4 abbia gli stessi problemi che v1.1 ha fatto (gli utenti sono convertiti in ruoli, i vincoli non sono creati nell’ordine giusto), ma non è una soluzione per me perché non fa script sugli oggetti a diversi file come l’opzione Compiti-> Genera script in SSMS. Attualmente sto usando una versione modificata di Scriptio (usa l’API MS SMO) per fungere da sostituto migliorato per la procedura guidata di pubblicazione del database (sqlpubwiz.exe). Al momento non è ansible scrivere script dalla riga di comando, potrei aggiungere questo contributo in futuro.

Scriptio è stato originariamente pubblicato sul blog di Bill Graziano, ma è stato successivamente rilasciato a CodePlex da Bill e aggiornato da altri. Leggi la discussione per vedere come compilare per l’utilizzo con SQL Server 2008.

http://scriptio.codeplex.com/

EDIT: Da allora ho iniziato a utilizzare il prodotto Confronta SQL di RedGate per farlo. È un bel sostituto per tutto ciò che la procedura guidata per la pubblicazione di sql avrebbe dovuto essere. Scegliete un database, un backup o un’istantanea come sorgente e una cartella come posizione di output e scarica tutto in una struttura di cartelle. Capita di essere lo stesso formato che usa il loro altro prodotto, SQL Source Control.

SqlPubwiz ha opzioni molto limitate rispetto alla generazione di script in SSMS. Al contrario, le opzioni disponibili con SMO corrispondono quasi esattamente a quelle in SSMS, suggerendo che probabilmente è lo stesso codice. (Spero che MS non l’abbia scritto due volte!) Ci sono molti esempi su MSDN come questo che mostrano tabelle di scripting come oggetti singoli. Tuttavia, se si desidera che tutto funzioni correttamente in uno script con uno schema “completo” che include oggetti “DRI” (integrità referenziale dichiarativa) come chiavi esterne, le tabelle di scripting singolarmente non funzionano correttamente. Ho scoperto che è necessario raccogliere tutti gli URN e consegnarli allo scripter come array. Questo codice, modificato dall’esempio, funziona per me (anche se forse dovresti riordinarlo e commentarlo un po ‘di più):

 using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Sdk.Sfc; ... // Connect to the local, default instance of SQL Server. Server srv = new Server(); // Reference the database. Database db = srv.Databases["YOURDBHERE"]; Scripter scrp = new Scripter(srv); scrp.Options.ScriptDrops = false; scrp.Options.WithDependencies = true; scrp.Options.Indexes = true; // To include indexes scrp.Options.DriAllConstraints = true; // to include referential constraints in the script scrp.Options.Triggers = true; scrp.Options.FullTextIndexes = true; scrp.Options.NoCollation = false; scrp.Options.Bindings = true; scrp.Options.IncludeIfNotExists = false; scrp.Options.ScriptBatchTerminator = true; scrp.Options.ExtendedProperties = true; scrp.PrefetchObjects = true; // some sources suggest this may speed things up var urns = new List(); // Iterate through the tables in database and script each one foreach (Table tb in db.Tables) { // check if the table is not a system table if (tb.IsSystemObject == false) { urns.Add(tb.Urn); } } // Iterate through the views in database and script each one. Display the script. foreach (View view in db.Views) { // check if the view is not a system object if (view.IsSystemObject == false) { urns.Add(view.Urn); } } // Iterate through the stored procedures in database and script each one. Display the script. foreach (StoredProcedure sp in db.StoredProcedures) { // check if the procedure is not a system object if (sp.IsSystemObject == false) { urns.Add(sp.Urn); } } StringBuilder builder = new StringBuilder(); System.Collections.Specialized.StringCollection sc = scrp.Script(urns.ToArray()); foreach (string st in sc) { // It seems each string is a sensible batch, and putting GO after it makes it work in tools like SSMS. // Wrapping each string in an 'exec' statement would work better if using SqlCommand to run the script. builder.AppendLine(st); builder.AppendLine("GO"); } return builder.ToString(); 

Ho scritto un programma di utilità di riga di comando open source denominato SchemaZen che esegue questa operazione. È molto più veloce dello scripting da parte di Management Studio e il suo output è più adatto al controllo della versione. Supporta lo scripting di schemi e dati.

Per generare script, esegui:

  script schemazen.exe --server localhost --database db --scriptDir c: \ somedir 

Quindi per ricreare il database dagli script eseguiti:

  schemazen.exe create --server localhost --database db --scriptDir c: \ somedir 

È ansible utilizzare SQL Server Management Object (SMO) per automatizzare le attività di gestione di SQL Server 2005, compresa la generazione di script: http://msdn.microsoft.com/en-us/library/ms162169.aspx .

Se sei uno sviluppatore, sicuramente vai con SMO. Ecco un collegamento alla class Scripter, che è il tuo punto di partenza:

Classe di scripting

Non vedo PowerShell con SQLPSX menzionato in nessuna di queste risposte … Personalmente non ho giocato con esso, ma sembra magnificamente semplice da usare e ideale per questo tipo di attività di automazione, con attività come:

 Get-SqlDatabase -dbname test -sqlserver server | Get-SqlTable | Get-SqlScripter | Set-Content -Path C:\script.sql Get-SqlDatabase -dbname test -sqlserver server | Get-SqlStoredProcedure | Get-SqlScripter Get-SqlDatabase -dbname test -sqlserver server | Get-SqlView | Get-SqlScripter 

(ref: http://www.sqlservercentral.com/Forums/Topic1167710-1550-1.aspx#bm1168100 )

Pagina del progetto: http://sqlpsx.codeplex.com/

Il vantaggio principale di questo approccio è che combina la configurabilità / personalizzazione dell’utilizzo di SMO direttamente, con la praticità e la manutenibilità di utilizzare uno strumento semplice come la Pubblicazione guidata del database.

In Strumenti> Opzioni> Designer> Designer tabella e database è disponibile un’opzione per “Genera automaticamente script di modifica” che genererà uno per ogni modifica apportata al momento in cui viene salvata.

Puoi farlo con il codice T-SQL usando le tabelle INFORMATION_SCHEMA.

Esistono anche strumenti di terze parti: mi piace Apex SQL Script esattamente per l’uso di cui si sta parlando. Lo eseguo completamente dalla riga di comando.

Se si desidera una soluzione Microsoft, è ansible provare: Pubblicazione guidata database di Microsoft SQL Server 1.1

http://www.microsoft.com/downloads/details.aspx?FamilyId=56E5B1C5-BF17-42E0-A410-371A838E570A&displaylang=en

Crea un processo batch che può essere eseguito ogni volta che è necessario ribuild gli script.

Ho usato DB Comparer – Il suo DB gratuito e privo di confusione intero DB e può confrontare con un altro DB e anche produrre uno script Diff. Eccellente per gli script di modifica dello sviluppo in produzione. http://www.dbcomparer.com/

C’è anche questo semplice strumento a riga di comando che costruisco per le mie esigenze.
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/

Può esportare un intero db e tenta di esportare oggetti crittografati. Tutto è archiviato in cartelle e file sql separati per un facile confronto dei file.

Il codice è anche disponibile su github.

Da Visual Studio 2008 SP1 TeamSuite:

Nella scheda Esplora server / Connessioni dati è disponibile uno strumento di pubblicazione su provider che funziona come “Pubblicazione guidata di database di Microsoft SQL Server”, ma che è compatibile con MS Sql Server 2008.

Sto usando VS 2012 (per DB su MSSQL Server 2008) Confronto database ha un’opzione per salvarlo, il confronto e le opzioni. Questo è essenzialmente ciò che sono le impostazioni per la consegna. Dopodiché puoi aggiornare o generare script.

Mi è sembrato un po ‘imbarazzante caricarlo dal file in un secondo momento (drag and drop da Windows Explorer) poiché non vedo il file in Solution Explorer.