web-dev-qa-db-fra.com

Comment 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 je fais:

  • 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 vous avez besoin, puis cliquez sur Tout sélectionner dans l'onglet "Sélectionner un objet".
  • Sélectionnez le dossier d'exportation
  • Finalement, cliquez sur le bouton "Terminer"

Est-il possible d'automatiser cette tâche?

Edit: Je veux générer creation scripts, pas modifier les scripts.

88
Brann

Ce que Brann mentionne de Visual Studio 2008 SP1 Team Suite 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?) Sur\Program Files\Microsoft SQL Server\90\Tools\Publishing\1.4. L’appel du serveur virtuel à partir de l’explorateur de serveurs l’appelle simplement. Vous pouvez obtenir les mêmes fonctionnalités via la ligne de commande, comme suit:

sqlpubwiz help script

Je ne sais pas si la v1.4 présente 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 il ne script pas les objets à différents fichiers tels que l'option Tâches-> Générer des scripts dans SSMS. J'utilise actuellement une version modifiée de Scriptio (qui utilise l'API MS SMO) pour remplacer de manière améliorée l'assistant de publication de base de données (sqlpubwiz.exe). Ce n'est pas actuellement scriptable de la ligne de commande, je pourrais ajouter cette contribution dans le futur.

Scriptio a été initialement publié sur le blog de Bill Graziano, mais a par la suite é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 joli 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é en tant que source et un dossier en tant qu'emplacement de sortie. Le tout est correctement vidé dans une structure de dossiers. Il se trouve que ce format est identique à celui utilisé par leur autre produit, SQL Source Control.

31
noobish

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 y a plusieurs exemples sur MSDN comme celui-ci qui montrent les tables de script sous forme d'objets individuels. Toutefois, si vous souhaitez que tous les scripts soient correctement écrits avec un schéma "complet" comprenant des objets "DRI" (intégrité référentielle déclarative) tels que des clés étrangères, les tables de scripting individuellement ne fonctionnent 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é à partir de l'exemple, fonctionne pour moi (même si je peux vous 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();
38
OlduwanSteve

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 studio de gestion et sa sortie est plus conviviale pour le contrôle de version. Il supporte les scripts de schéma et de 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
Seth Reno

Vous pouvez utiliser SMO (SQL Server Management Object) 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.

12
Joe

Je ne vois pas PowerShell avec SQLPSX mentionné dans aucune de ces réponses ... Personnellement, je n'y ai pas joué, mais il est très simple d'utilisation et convient parfaitement à 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

(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 directe de SMO à la commodité et la maintenabilité de l’utilisation d’un simple outil existant tel que l’Assistant de publication de base de données.

7
Tao

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

Scripter Class

7
Ryan Lundy

Dans Outils> Options> Concepteurs> Concepteurs de tables et de bases de données, l'option "Générer automatiquement les scripts de modification" en génère un pour chaque modification effectuée au moment de son enregistrement.

4
John Sheehan

Vous pouvez le faire avec du code T-SQL à l'aide des tables INFORMATION_SCHEMA.

Il existe également des outils tiers - j'aime bien Apex SQL Script pour l'utilisation dont vous parlez. Je le lance complètement à partir de la ligne de commande.

3
Cade Roux

Si vous souhaitez une solution Microsoft, vous pouvez essayer: Publication de la base de données Microsoft SQL Server Wizard 1.1

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

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

2
Glennular

J'utilise DB Comparer - Son DB complet et son script est simple et gratuit, et il peut être comparé à un autre DB et produire également un script Diff. Excellent pour les scripts de changement de développement à la production. http://www.dbcomparer.com/

2
MartinC

Il existe également ce simple outil de ligne de commande 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.

1
George Kosmidis

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

Je trouve cela un peu délicat de le charger ultérieurement dans un fichier (glisser-déposer depuis Windows Explorer) car je ne vois pas le fichier dans la solution Explorer.

0
zhrist

De Visual Studio 2008 SP1 TeamSuite:

Dans l'onglet Explorateur de serveurs/Connexions de données, il existe un outil de publication dans 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
Brann

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

Travaillé pour moi comme un charme. C’est un nouvel outil Microsoft basé sur Python qui s’exécute à partir de la ligne de commande . Tout fonctionne comme décrit sur la page Microsoft (voir le lien ci-dessous) Travaillé pour moi avec le serveur SQL 2012.

Vous l'installez avec pip:

$ pip install mssql-scripter

Aperçu des paramètres de commande, comme d'habitude, avec l'aide de h

mssql-scripter -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-views/

0
matthhias