Comment puis-je automatiser la tâche «générer des scripts» dans SQL Server Management Studio 2008?

98

Je souhaite automatiser la génération de scripts dans SQL Server Management Studio 2008.

En ce moment, ce que je fais est:

  • Faites un clic droit sur ma base de données, Tâches, "Générer des scripts ..."
  • sélectionnez manuellement toutes les options d'exportation dont j'ai besoin et appuyez sur Tout sélectionner dans l'onglet "Sélectionner un objet"
  • Sélectionnez le dossier d'exportation
  • Appuyez finalement sur le bouton "Terminer"

Existe-t-il un moyen d'automatiser cette tâche?

Edit: Je souhaite générer des scripts de création , pas modifier des scripts.

Brann
la source
avez-vous trouvé la réponse? Je veux faire ça aussi, j'ai utilisé la publication, il a enregistré sur le disque, je ne sais pas où et là je n'ai pas toutes les options qui sont lors de la génération d'un script: -?
Alexa Adrian
1
Comme mentionné dans plusieurs des réponses, utilisez SMO si vous êtes un développeur
Jay Jay Jay

Réponses:

31

Ce que Brann mentionne dans la suite d'équipe Visual Studio 2008 SP1 est la version 1.4 de l'assistant de publication de base de données. Il est installé avec SQL Server 2008 (peut-être uniquement professionnel?) Dans \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ Publishing \ 1.4. L'appel VS de l'explorateur de serveur appelle simplement ceci. Vous pouvez obtenir les mêmes fonctionnalités via la ligne de commande comme:

sqlpubwiz help script

Je ne sais pas si la v1.4 a les mêmes problèmes que la v1.1 (les utilisateurs sont convertis en rôles, les contraintes ne sont pas créées dans le bon ordre), mais ce n'est pas une solution pour moi car elle ne script pas les objets à différents fichiers comme le fait l'option Tâches-> Générer des scripts dans SSMS. J'utilise actuellement une version modifiée de Scriptio (utilise l'API MS SMO) pour remplacer l'assistant de publication de base de données (sqlpubwiz.exe). Il n'est actuellement pas scriptable à partir de la ligne de commande, je pourrais ajouter cette contribution à l'avenir.

Scriptio a été initialement publié sur le blog de Bill Graziano, mais a ensuite été publié sur CodePlex par Bill et mis à jour par d'autres. Lisez la discussion pour savoir comment compiler pour une utilisation avec SQL Server 2008.

http://scriptio.codeplex.com/

EDIT: J'ai depuis commencé à utiliser le produit SQL Compare de RedGate pour ce faire. C'est un très bon remplacement pour tout ce que l'assistant de publication SQL aurait dû être. Vous choisissez une base de données, une sauvegarde ou un instantané comme source et un dossier comme emplacement de sortie et tout est bien vidé dans une structure de dossiers. Il s'agit du même format que celui utilisé par leur autre produit, SQL Source Control.

noobish
la source
Y a-t-il un équivalent en 2012? Je serais simplement heureux si l'assistant se souvenait de mes paramètres tels que "Index de script".
PeterX
6
@PeterX SMSS> Outils> Options> Explorateur d'objets SQL Server> Script
zanlok
1
Pour 2012 suivez ce guide: simple-talk.com/sql/database-administration
Simon Hutchison
@zanlok commentaire très utile. Malheureusement, il leur manque l'option «Inclure les instructions non prises en charge» dans SQL Server 2014.
jk7
42

SqlPubwiz a des options très limitées par rapport à la génération de script dans SSMS. En revanche, les options disponibles avec SMO correspondent presque exactement à celles de SSMS, ce qui suggère qu'il s'agit probablement du même code. (J'espère que MS ne l'a pas écrit deux fois!) Il existe plusieurs exemples sur MSDN comme celui-ci qui montrent des tables de script en tant qu'objets individuels. Cependant, si vous voulez que tout scripte correctement avec un schéma «complet» qui inclut des objets «DRI» (Declarative Referential Integrity) comme des clés étrangères, alors le script de tables individuellement ne fonctionne pas correctement les dépendances. J'ai trouvé qu'il était nécessaire de collecter tous les URN et de les remettre au scripteur sous forme de tableau. Ce code, modifié de l'exemple,

    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
la source
9
Vous pouvez consulter la classe à Microsoft.SqlServer.Management.SqlScriptPublish.ScriptPublishWizardpartir de l'assembly C: \ Program Files (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ Microsoft.SqlServer.Management.SqlScriptPublishUI.dll. C'est ce qu'utilise SSMS. (Vous pouvez également consulter la classe Microsoft.SqlServer.Management.UI.GenerateScriptde l'assembly C: \ Program Files (x86) \ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ ReplicationDialog.dll.)
cubetwo1729
L'exemple de code et les liens ici étaient un bon début et devraient être la réponse la plus complète à l'OP (qui était aussi ma question exacte).
zanlok
1
J'ai piraté une application C # qui vous permet de générer des scripts de serveur SQL à partir de la ligne de commande sous Linux. Tout ce dont vous avez besoin est un aperçu de .Net Core 2: github.com/mkurz/SQLServerScripter
mkurz
20

J'ai écrit un utilitaire de ligne de commande open source nommé SchemaZen qui fait cela. C'est beaucoup plus rapide que le script du studio de gestion et sa sortie est plus conviviale pour le contrôle de version. Il prend en charge la création de scripts à la fois de schéma et de données.

Pour générer des scripts, exécutez:

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

Ensuite, pour recréer la base de données à partir de scripts exécutez:

schemazen.exe create --server localhost --database db --scriptDir c: \ somedir
Seth Reno
la source
Je viens d'essayer SchemaZen et je suis vraiment impressionné. A travaillé la première fois. Merci Seth!
Simon Hughes
@Seth alors qu'utilisez-vous pour scripter les objets? Je n'ai pas vu une seule référence à quelque chose de Microsoft.SqlServer (enfin, il y avait une seule instruction d'utilisation non utilisée).
John
@John - Schema Zen contient sa propre bibliothèque de scripts. Il lit le schéma dans un modèle puis génère les scripts basés sur le modèle. Voir github.com/sethreno/schemazen/blob/master/model/Models/… pour un exemple simple.
Seth Reno
8

Si vous êtes un développeur, optez pour SMO. Voici un lien vers la classe Scripter, qui est votre point de départ:

Classe de scripteur

Ryan Lundy
la source
7

Je ne vois pas de PowerShell avec SQLPSX mentionné dans aucune de ces réponses ... Personnellement, je n'ai pas joué avec mais il semble magnifiquement simple à utiliser et parfaitement adapté à ce type de tâches d'automatisation, avec des tâches telles que:

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

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

Page du projet: http://sqlpsx.codeplex.com/

Le principal avantage de cette approche est qu'elle combine la configurabilité / personnalisation de l'utilisation directe de SMO, avec la commodité et la maintenabilité d'utiliser un outil existant simple comme l'assistant de publication de base de données.

Tao
la source
1
J'ai passé un certain temps à essayer cette solution, mais à la fin je me suis tourné vers C # et en utilisant le SMO. Le problème que je ne pouvais pas facilement trouver un moyen de surmonter est que l'exemple de code script chaque table individuellement. Une fois que vous commencez à ajouter des objets 'DRI' (Declarative Referential Integrity) comme des clés étrangères, les dépendances ne seront pas correctes et / ou ce sera très lent.
OlduwanSteve
4

Dans Outils> Options> Concepteurs> Concepteurs de tables et de bases de données, il existe une option pour «Générer automatiquement des scripts de modification» qui en générera un pour chaque modification que vous apportez au moment où vous l'enregistrez.

John Sheehan
la source
3
Ce n'est pas exactement ce dont j'ai besoin. J'aimerais obtenir les scripts de création (mon objectif final est de consigner automatiquement ces fichiers dans mon système de contrôle de source)
Brann
3

Vous pouvez le faire avec du code T-SQL en utilisant les tables INFORMATION_SCHEMA.

Il existe également des outils tiers - j'aime Apex SQL Script précisément pour l'utilisation dont vous parlez. Je l'exécute complètement à partir de la ligne de commande.

Cade Roux
la source
3

Essayez les nouveaux outils de ligne de commande SQL Server pour générer des scripts T-SQL et surveiller les vues de gestion dynamique.

A travaillé pour moi comme du charme. Il s'agit d'un nouvel outil basé sur python de Microsoft qui s'exécute à partir de la ligne de commande. Tout fonctionne comme décrit sur la page Microsoft (voir le lien ci-dessous) a fonctionné pour moi avec le serveur SQL 2012.

Vous l'installez avec pip:

$ pip installer mssql-scriptter

Vue d'ensemble des paramètres de commande comme d'habitude avec h pour obtenir de l'aide:

mssql-scriptter -h

Astuce: si vous vous connectez à SQL-Server via l'authentification Windows, laissez simplement le nom d'utilisateur et le mot de passe.

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

Matthhias
la source
2

Si vous voulez une solution Microsoft, vous pouvez essayer: Assistant Publication de base de données Microsoft SQL Server 1.1

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

Il crée un processus par lots que vous pouvez exécuter à tout moment pour reconstruire les scripts.

Glennular
la source
1
Malheureusement, il ne prend pas en charge SqlServer 2008
Brann
1
La version 1.2 dit qu'elle prend en charge 2000 et 2005, mais je l'ai juste utilisée pour créer un script d'une base de données sur 2008 avec plus de 3800 tables et cela a bien fonctionné. Il n'incluait pas les options de compression, qui n'ont été introduites qu'en 2008. Je viens également de tester contre une base de données 2008 R2 et il écrit aussi très bien.
Jeremy
2

J'ai utilisé DB Comparer - Son script entier est gratuit et sans tracas et peut comparer à une autre base de données et produire également un script Diff. Excellent pour les scripts de modification du développement à la production. http://www.dbcomparer.com/

MartinC
la source
1

Il existe également cet outil de ligne de commande simple que je construis pour mes besoins.
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/

Il peut exporter une base de données entière et tente d'exporter des objets chiffrés. Tout est stocké dans des dossiers et des fichiers sql séparés pour une comparaison facile des fichiers.

Le code est également disponible sur github.

George Kosmidis
la source
0

À partir de Visual Studio 2008 SP1 TeamSuite:

Dans l'onglet Explorateur de serveurs / Connexions de données, il existe un outil de publication vers le fournisseur qui fait la même chose que «Assistant de publication de base de données Microsoft SQL Server», mais qui est compatible avec MS Sql Server 2008.

Brann
la source
Comment cela aide-t-il à automatiser la tâche?
Serge Wautier
0

J'utilise VS 2012 (pour les bases de données sur MSSQL Server 2008) comparer la base de données a une option pour l'enregistrer, la comparaison et les options. Ce sont essentiellement vos paramètres de livraison. Après cela, vous pouvez mettre à jour ou générer un script.

Je trouve juste qu'il est un peu difficile de le charger à partir d'un fichier plus tard (glisser-déposer depuis l'explorateur Windows) car je ne vois pas le fichier dans l'explorateur de solutions.

zhrist
la source