Wie kann ich die Aufgabe "Skripte generieren" in SQL Server Management Studio 2008 automatisieren?

97

Ich möchte die Skriptgenerierung in SQL Server Management Studio 2008 automatisieren.

Im Moment mache ich:

  • Klicken Sie mit der rechten Maustaste auf meine Datenbank, Aufgaben, "Skripte generieren ..."
  • Wählen Sie manuell alle benötigten Exportoptionen aus und klicken Sie auf der Registerkarte "Objekt auswählen" auf "Alle auswählen"
  • Wählen Sie den Exportordner
  • Klicken Sie schließlich auf die Schaltfläche "Fertig stellen"

Gibt es eine Möglichkeit, diese Aufgabe zu automatisieren?

Bearbeiten: Ich möchte Erstellungsskripte generieren , keine Skripte ändern.

Brann
quelle
Hast du die Antwort gefunden? Ich möchte dies auch tun, ich habe Publishing verwendet, es wurde hart gespeichert, ich weiß nicht wo und dort habe ich nicht alle Optionen, die beim Generieren eines Skripts zur Verfügung stehen: -?
Alexa Adrian
1
Wie in mehreren Antworten erwähnt, verwenden Sie SMO, wenn Sie ein Entwickler sind
Jay Jay Jay

Antworten:

31

Was Brann in der Visual Studio 2008 SP1 Team Suite erwähnt, ist Version 1.4 des Datenbankveröffentlichungsassistenten. Es wird mit SQL Server 2008 (möglicherweise nur professionell?) Unter \ Programme \ Microsoft SQL Server \ 90 \ Tools \ Publishing \ 1.4 installiert. Der VS-Aufruf vom Server-Explorer ruft dies einfach auf. Sie können die gleiche Funktionalität über die Befehlszeile erreichen wie:

sqlpubwiz help script

Ich weiß nicht, ob v1.4 dieselben Probleme hat wie v1.1 (Benutzer werden in Rollen konvertiert, Einschränkungen werden nicht in der richtigen Reihenfolge erstellt), aber es ist keine Lösung für mich, da keine Skriptobjekte erstellt werden auf verschiedene Dateien wie die Option Aufgaben-> Skripte generieren in SSMS. Ich verwende derzeit eine modifizierte Version von Scriptio (verwendet die MS SMO-API), um als verbesserter Ersatz für den Datenbankveröffentlichungsassistenten (sqlpubwiz.exe) zu fungieren. Es ist derzeit nicht über die Befehlszeile skriptfähig. Ich könnte diesen Beitrag in Zukunft hinzufügen.

Scriptio wurde ursprünglich auf Bill Grazianos Blog veröffentlicht, später jedoch von Bill für CodePlex veröffentlicht und von anderen aktualisiert. In der Diskussion erfahren Sie, wie Sie zur Verwendung mit SQL Server 2008 kompilieren.

http://scriptio.codeplex.com/

BEARBEITEN: Ich habe seitdem begonnen, das SQL Compare-Produkt von RedGate zu verwenden, um dies zu tun. Es ist ein sehr schöner Ersatz für alles, was der SQL Publishing-Assistent hätte sein sollen. Sie wählen eine Datenbank, ein Backup oder einen Snapshot als Quelle und einen Ordner als Ausgabespeicherort, und alles wird gut in eine Ordnerstruktur kopiert. Es ist zufällig dasselbe Format, das das andere Produkt, SQL Source Control, verwendet.

noobisch
quelle
Gibt es 2012 ein Äquivalent? Ich würde mich nur freuen, wenn sich der Assistent an meine Einstellungen wie "Skriptindizes" erinnern würde.
PeterX
6
@ PeterX SMSS> Extras> Optionen> SQL Server-Objekt-Explorer>
Skripterstellung
1
Für 2012 folgen Sie diesem Leitfaden: simple-talk.com/sql/database-administration/…
Simon Hutchison
@zanlok sehr nützlicher Kommentar. Leider fehlt ihnen die Option "Nicht unterstützte Anweisungen
einschließen
42

SqlPubwiz bietet im Vergleich zur Skriptgenerierung in SSMS nur sehr eingeschränkte Optionen. Im Gegensatz dazu stimmen die mit SMO verfügbaren Optionen fast genau mit denen in SSMS überein, was darauf hindeutet, dass es sich wahrscheinlich sogar um denselben Code handelt. (Ich würde hoffen, dass MS es nicht zweimal geschrieben hat!) Es gibt mehrere Beispiele auf MSDN wie dieses , die Skriptertabellen als einzelne Objekte zeigen. Wenn Sie jedoch möchten, dass alles korrekt mit einem 'vollständigen' Schema geschrieben wird, das 'DRI'-Objekte (Declarative Referential Integrity) wie Fremdschlüssel enthält, werden die Abhängigkeiten durch Skripten von Tabellen einzeln nicht korrekt ausgeführt. Ich fand es notwendig, alle URNs zu sammeln und sie als Array an den Scripter zu übergeben. Dieser Code, geändert aus dem Beispiel,

    using Microsoft.SqlServer.Management.Smo;
    using Microsoft.SqlServer.Management.Sdk.Sfc;
    // etc...

    // 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<Urn>();

    // 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();
OlduwanSteve
quelle
9
Sie können die Klasse Microsoft.SqlServer.Management.SqlScriptPublish.ScriptPublishWizardin der Assembly C: \ Programme (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ Microsoft.SqlServer.Management.SqlScriptPublishUI.dll anzeigen. Dies ist, was SSMS verwendet. (Alternativ können Sie sich die Klasse Microsoft.SqlServer.Management.UI.GenerateScriptaus der Assembly C: \ Programme (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ ReplicationDialog.dll
ansehen
Der Beispielcode und die Links hier waren ein guter Anfang und sollten die vollständigste Antwort auf das OP sein (was auch meine genaue Frage war).
Zanlok
1
Ich habe eine C # -App gehackt, mit der Sie SQL Server-Skripte über die Befehlszeile unter Linux generieren können. Alles was Sie brauchen ist .Net Core 2 Vorschau: github.com/mkurz/SQLServerScripter
mkurz
20

Ich habe ein Open-Source-Befehlszeilenprogramm namens SchemaZen geschrieben , das dies tut. Es ist viel schneller als Skripte aus dem Management Studio und die Ausgabe ist versionierungsfreundlicher. Es unterstützt die Skripterstellung von Schema und Daten.

So generieren Sie Skripte:

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

Um die Datenbank aus Skripten neu zu erstellen, führen Sie Folgendes aus:

schemazen.exe create --server localhost --database db --scriptDir c: \ somedir
Seth Reno
quelle
Ich habe gerade SchemaZen ausprobiert und bin wirklich beeindruckt. Arbeitete das erste Mal. Danke Seth!
Simon Hughes
@ Seth also was benutzt du, um die Objekte zu skripten? Ich habe keinen einzigen Verweis auf einen Microsoft.SqlServer gesehen (nun, es gab eine einzige nicht verwendete using-Anweisung).
John
@ John - Schema Zen enthält eine eigene Bibliothek für Skripte. Es liest das Schema in ein Modell und generiert dann die Skripte basierend auf dem Modell. Ein einfaches Beispiel finden Sie unter github.com/sethreno/schemazen/blob/master/model/Models/… .
Seth Reno
7

Wenn Sie ein Entwickler sind, entscheiden Sie sich auf jeden Fall für SMO. Hier ist ein Link zur Scripter-Klasse, die Ihr Ausgangspunkt ist:

Scripter-Klasse

Ryan Lundy
quelle
7

Ich sehe keine Powershell mit SQLPSX, die in einer dieser Antworten erwähnt wird ... Ich persönlich habe nicht damit gespielt, aber es sieht sehr einfach aus und ist ideal für diese Art von Automatisierungsaufgaben geeignet, mit Aufgaben wie:

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 )

Projektseite: http://sqlpsx.codeplex.com/

Der Hauptvorteil dieses Ansatzes besteht darin, dass er die Konfigurierbarkeit / Anpassbarkeit der direkten Verwendung von SMO mit der Bequemlichkeit und Wartbarkeit der Verwendung eines einfachen vorhandenen Tools wie dem Datenbankveröffentlichungsassistenten kombiniert.

Tao
quelle
1
Ich habe eine Weile damit verbracht, diese Lösung auszuprobieren, aber am Ende habe ich mich an C # gewandt und das SMO verwendet. Das Problem, das ich nicht leicht überwinden konnte, ist, dass der Beispielcode jede Tabelle einzeln schreibt. Sobald Sie DRI-Objekte (Declarative Referential Integrity) wie Fremdschlüssel hinzufügen, werden die Abhängigkeiten nicht mehr richtig und / oder es wird sehr langsam.
OlduwanSteve
4

Unter Extras> Optionen> Designer> Tabellen- und Datenbankdesigner gibt es eine Option für "Änderungsskripte automatisch generieren", die für jede Änderung, die Sie zum Zeitpunkt des Speicherns vornehmen, eine generiert.

John Sheehan
quelle
3
Das ist nicht genau das, was ich brauche. Ich möchte die Erstellungsskripte erhalten (mein letztes Ziel ist es, diese Dateien automatisch in mein Versionsverwaltungssystem einzuchecken)
Brann
3

Sie können dies mit T-SQL-Code mithilfe der Tabellen INFORMATION_SCHEMA tun.

Es gibt auch Tools von Drittanbietern - ich mag Apex SQL Script genau für die Verwendung, über die Sie sprechen. Ich führe es komplett über die Kommandozeile aus.

Cade Roux
quelle
3

Probieren Sie neue SQL Server-Befehlszeilentools aus, um T-SQL-Skripts zu generieren und dynamische Verwaltungsansichten zu überwachen.

Arbeitete für mich wie Charme. Es ist ein neues Python-basiertes Tool von Microsoft, das über die Befehlszeile ausgeführt wird. Alles funktioniert wie auf der Microsoft-Seite beschrieben (siehe Link unten). Hat bei mir mit SQL 2012 Server funktioniert.

Sie installieren es mit pip:

$ pip installiere mssql-scripter

Befehlsparameterübersicht wie gewohnt mit h zur Hilfe:

mssql-scripter -h

Tipp: Wenn Sie sich über die Windows-Authentifizierung bei SQL-Server anmelden, lassen Sie einfach Benutzername und Kennwort weg.

https://cloudblogs.microsoft.com/sqlserver/2017/05/17/try-new-sql-server-command-line-tools-to-generate-t-sql-scripts-and-monitor-dynamic-management- Ansichten /

matthhias
quelle
2

Wenn Sie eine Microsoft-Lösung wünschen, können Sie Folgendes versuchen: Microsoft SQL Server Database Publishing Wizard 1.1

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

Es wird ein Stapelprozess erstellt, den Sie jederzeit ausführen können, wenn Sie die Skripte neu erstellen müssen.

Glennular
quelle
1
Leider unterstützt es nicht SqlServer 2008
Brann
1
Version 1.2 sagt, dass es 2000 und 2005 unterstützt, aber ich habe es nur verwendet, um 2008 eine Datenbank mit mehr als 3800 Tabellen zu skripten, und es hat gut funktioniert. Es enthielt keine Komprimierungsoptionen, die erst 2008 eingeführt wurden. Ich habe auch gerade eine 2008 R2-Datenbank getestet und es wurden auch Skripte erstellt.
Jeremy
2

Ich habe DB Comparer verwendet - Es ist ein kostenloses und unkompliziertes Skript für die gesamte Datenbank und kann mit einer anderen Datenbank verglichen werden und auch ein Diff-Skript erstellen. Hervorragend geeignet für Skripte zur Änderung der Entwicklung zur Produktion. http://www.dbcomparer.com/

MartinC
quelle
1

Es gibt auch dieses einfache Befehlszeilentool, das ich für meine Bedürfnisse erstellt habe.
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/

Es kann eine ganze Datenbank exportieren und versucht, verschlüsselte Objekte zu exportieren. Alles wird in Ordnern und separaten SQL-Dateien für einen einfachen Dateivergleich gespeichert.

Code ist auch auf Github verfügbar.

George Kosmidis
quelle
0

Aus Visual Studio 2008 SP1 TeamSuite:

Auf der Registerkarte "Server-Explorer / Datenverbindungen" befindet sich ein Tool zum Veröffentlichen auf dem Anbieter, das mit dem "Microsoft SQL Server-Datenbankveröffentlichungsassistenten" identisch ist, jedoch mit MS SQL Server 2008 kompatibel ist.

Brann
quelle
Wie hilft es, die Aufgabe zu automatisieren?
Serge Wautier
0

Ich verwende VS 2012 (für DBs unter MSSQL Server 2008). Die Vergleichsdatenbank hat eine Option zum Speichern, den Vergleich und Optionen. Dies sind im Wesentlichen Ihre Einstellungen für die Lieferung. Danach können Sie ein Skript aktualisieren oder generieren.

Ich finde es nur etwas umständlich, es später aus einer Datei zu laden (Drag & Drop aus dem Windows Explorer), da ich die Datei im Solution Explorer nicht sehe.

zhrist
quelle