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

Je voudrais automatiser la génération de script 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, puis cliquez sur Tout sélectionner dans l'onglet" sélectionner un objet "
  • Sélectionnez le dossier d'exportation
  • Appuyez éventuellement sur le bouton" Terminer "

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

Edit : je veux générer création scripts, pas changer les scripts.

88
demandé sur Brann 2009-01-27 17:24:14

13 réponses

Ce que Brann mentionne de 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 seulement professionnel?) à \ Program Files \ Microsoft SQL Server \ 90 \ Tools\Publishing \ 1.4. L'appel VS De server explorer appelle simplement ceci. Vous pouvez obtenir la même fonctionnalité via la ligne de commande comme:

sqlpubwiz help script

Je ne sais pas si v1. 4 a les mêmes problèmes que v1.1 (les utilisateurs sont convertis en rôles, les contraintes sont pas créé dans le bon ordre), mais ce n'est pas une solution pour moi car il 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 remplacer l'assistant de publication de base de données (sqlpubwiz.EXE). Ce n'est pas actuellement scriptable à partir de la ligne de commande, je pourrais ajouter cette contribution à l'avenir.

Scriptio a été initialement posté sur le blog de Bill Graziano, mais a ensuite été publié à 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 de comparaison SQL 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. structure des dossiers. Il se trouve être le même format que leur autre produit, SQL Source Control, utilise.

31
répondu noobish 2010-10-06 19:53:01

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 des SSMS, ce qui suggère que c'est probablement même le 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 {[3] } qui montrent les tables de script comme des objets individuels. Cependant, si vous voulez que tout soit correctement scripté avec un schéma 'complet' qui inclut 'DRI' (intégrité référentielle déclarative) les objets comme les clés étrangères puis les tables de script individuellement ne fonctionnent pas correctement les dépendances. J'ai trouvé qu'il est nécessaire de collecter toutes les Urnes et les remettre au scripteur comme un tableau. Ce code, modifié à partir de l'exemple, fonctionne pour moi (même si j'ose dire que vous pourriez le ranger et le commenter un peu plus):

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<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();
36
répondu OlduwanSteve 2012-07-25 17:27:06

J'ai écrit un utilitaire de ligne de commande open source nommé SchemaZen qui fait cela. C'est beaucoup plus rapide que les scripts de management studio et sa sortie est plus conviviale pour le contrôle de version. Il prend en charge les scripts à la fois le schéma et les 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 de scripts, exécutez:

schemazen.exe create --server localhost --database db --scriptDir c:\somedir
13
répondu Seth Reno 2015-07-16 14:48:52

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

12
répondu Joe 2009-01-27 14:41:51

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

Classe Scripter

7
répondu Ryan Lundy 2009-01-27 15:01:46

Je ne vois pas powershell avec SQLPSX mentionné dans l'une de ces réponses... Personnellement, je n'ai pas joué avec, mais il semble magnifiquement simple à utiliser et idéalement adapté à ce type de tâches d'automatisation, avec des tâches comme:

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)

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

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

7
répondu Tao 2011-10-13 06:55:46

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 effectuez au moment de l'enregistrer.

4
répondu John Sheehan 2009-01-27 14:27:24

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

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

3
répondu Cade Roux 2009-01-27 14:36:13

Si vous voulez une solution Microsoft, vous pouvez essayer: Assistant de 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 chaque fois que vous avez besoin de reconstruire les scripts.

2
répondu Glennular 2009-01-27 14:57:44

J'ai utilisé DB Comparer-son script gratuit et sans chichi DB entier et peut comparer à un autre DB et produire également un script Diff . Excellent pour le développement de scripts de changement de Production. http://www.dbcomparer.com/

2
répondu MartinC 2011-11-30 08:30:14

Il y a aussi cet outil de ligne de commande simple que je construis pour mon needs.
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 il essaie d'exporter des objets chiffrés. Tout est stocké dans des dossiers et des fichiers sql séparés pour faciliter la comparaison des fichiers.

Le Code est également disponible sur github.

1
répondu George Kosmidis 2013-11-27 14:04:32

De Visual Studio 2008 SP1 TeamSuite:

Dans L'onglet Explorateur de serveurs / connexions de données, il existe un outil publier sur 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.

0
répondu Brann 2009-01-27 15:12:18

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

Je trouve juste un peu gênant 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.

0
répondu zhrist 2015-07-07 07:44:21