107 votes

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

J'aimerais automatiser la génération de script dans SQL Server Management Studio 2008.

En ce moment, ce que je fais, c'est :

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

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

Edit : Je veux générer création des scripts, pas des scripts de changement.

1 votes

Avez-vous trouvé la réponse ? Je veux faire ça aussi, j'ai utilisé Publishing, ça a sauvegardé en dur, 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 :- ?

2 votes

Comme mentionné dans plusieurs réponses, utilisez le SMO si vous êtes un développeur.

46voto

OlduwanSteve Points 575

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 à ceux 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 y a plusieurs exemples sur MSDN comme celui-ci qui montrent les tableaux de scripts comme des objets individuels. Cependant, si vous voulez que tout soit script correctement avec un schéma 'complet' qui inclut des objets 'DRI' (Declarative Referential Integrity) comme les clés étrangères, alors le fait de scripter les tables individuellement ne fait pas fonctionner les dépendances correctement. J'ai trouvé qu'il est nécessaire de collecter tous les URNs et de les remettre au scripteur sous forme de tableau. Ce code, modifié à partir de l'exemple, fonctionne pour moi (bien que j'ose dire que vous pourriez le mettre en forme et le commenter un peu plus) :

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

10 votes

Vous pouvez regarder la classe Microsoft.SqlServer.Management.SqlScriptPublish.ScriptPublis‌​hWizard de l'assemblée C:\Program Fichiers (x86) \Microsoft SQL Server \110\Tools\Binn\ManagementStudio\Microsoft.SqlServer.M anagement.SqlScriptPublishUI.dll. C'est ce que SSMS utilise. (Alternativement, vous pouvez regarder la classe Microsoft.SqlServer.Management.UI.GenerateScript de l'assemblée C:\Program Fichiers (x86) \Microsoft SQL Server \110\Tools\Binn\ManagementStudio\ReplicationDialog.dll .)

0 votes

L'exemple de code et les liens ici ont été un excellent point de départ, et devraient être la réponse la plus complète à l'OP (qui était aussi ma question exacte).

2 votes

J'ai bricolé 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, c'est de l'aperçu de .Net Core 2 : github.com/mkurz/SQLServerScripter

31voto

noobish Points 443

Ce que Brann mentionne à partir de Visual Studio 2008 SP1 Team Suite est la version 1.4 du Database Publishing Wizard. Il est installé avec sql server 2008 (peut-être seulement professionnel ?) pour \Program Fichiers \Microsoft SQL Server \90\Tools\Publishing\1.4. L'appel VS depuis l'explorateur de serveur consiste simplement à appeler ceci. Vous pouvez réaliser la même fonctionnalité 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 parce qu'elle ne script pas les objets vers différents fichiers comme le fait l'option Tasks->Generate Scripts dans SSMS. J'utilise actuellement une version modifiée de Scriptio (utilise l'API MS SMO) pour agir comme un remplacement amélioré de l'assistant de publication de base de données (sqlpubwiz.exe). Il n'est pas actuellement possible de créer un script à partir de la ligne de commande, mais je pourrais ajouter cette contribution à l'avenir.

Scriptio a été initialement posté 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 voir 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 faire cela. 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 il dépose tout joliment dans une structure de dossiers. Il se trouve que c'est le même format que leur autre produit, SQL Source Control, utilise.

0 votes

Y a-t-il un équivalent en 2012 ? Je serais juste heureux si l'assistant se souvenait de mes paramètres comme "script Indexes".

8 votes

@PeterX SMSS > Outils > Options > SQL Server Object Explorer > Scripting

1 votes

Pour 2012, suivez ce guide : simple-talk.com/sql/database-administration/

22voto

Seth Reno Points 2221

J'ai écrit un utilitaire de ligne de commande open source appelé SchemaZen qui fait cela. Il est beaucoup plus rapide que le scriptage à partir de Management Studio et son résultat est plus convivial pour le contrôle de version. Il prend en charge le scriptage des schémas et des données.

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

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

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

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

1 votes

Je viens d'essayer SchemaZen et je suis vraiment impressionné. Ça a marché du premier coup. Merci Seth !

0 votes

@Seth alors qu'utilisez-vous pour script les objets ? Je n'ai pas vu une seule référence à un quelconque Microsoft.SqlServer (enfin il y avait une seule déclaration using non utilisée).

0 votes

@John - Schema Zen contient sa propre bibliothèque de scripts. Elle lit le schéma dans un modèle puis génère les scripts sur la base de ce modèle. Voir github.com/sethreno/schemazen/blob/master/model/Models/ pour un exemple simple.

13voto

Joe Points 60749

Vous pouvez utiliser SQL Server Management Object (SMO) pour automatiser les tâches de gestion de SQL Server 2005, notamment la génération de scripts : http://msdn.microsoft.com/en-us/library/ms162169.aspx .

9voto

Kyralessa Points 76456

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

Classe de scripteur

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X