Je voudrais mettre en place des tests solides sur mon projet et la façon dont je voudrais le faire est d'avoir un programme en command line que je peux exécuter qui ne copyra que la structure d'une database et non datatables réelles. Ensuite, je peux exécuter mes tests sur cette nouvelle database.
Des idées?
Mise à jour: quelqu'un a dit que je devrais spécifier une langue. Je pensais TSQL de cette façon si Sql Server s'exécutait, le script devrait fonctionner. En outre, il s'agit de SQL Server 2005.
Vous ne dites pas quelle version de SQL Server vous utilisez, si son 2005 regarde DMO – Database Management Objects, un set de bibliothèques COM qui vous donnent access à la fonctionnalité trouvée dans Enterprise Manager / Management Studio.
Pour 2008, nous avons des fonctionnalités similaires à SMO mais en tant qu'assemblages .Net, MS a quelques bons exemples de code . Leur exemple de script ressemble à celui dont vous avez besoin:
Levé de leur site, nous avons
//Connect to the local, default instance of SQL Server. { Server srv = default(Server); srv = new Server(); //Reference the AdventureWorks database. Database db = default(Database); db = srv.Databases("AdventureWorks"); //Define a Scripter object and set the required scripting options. Scripter scrp = default(Scripter); scrp = new Scripter(srv); scrp.Options.ScriptDrops = false; scrp.Options.WithDependencies = true; //Iterate through the tables in database and script each one. Display the script. //Note that the SsortingngCollection type needs the System.Collections.Specialized namespace to be included. Table tb = default(Table); Urn[] smoObjects = new Urn[2]; foreach ( tb in db.Tables) { smoObjects = new Urn[1]; smoObjects(0) = tb.Urn; if (tb.IsSystemObject == false) { SsortingngCollection sc = default(SsortingngCollection); sc = scrp.Script(smoObjects); ssortingng st = null; foreach ( st in sc) { Console.WriteLine(st); } } } }
Vous pouvez utiliser l'approche suivante http://fahadaz.blogspot.com/2008/10/database-scripts-and-contiguous.html, mais il a fallu que votre database crée des scripts.
Si vous ne les avez pas, vous pouvez utiliser l'article suivant pour les générer http://blog.sqlauthority.com/2007/08/21/sql-server-2005-create-script-to-copy-database-schema- et-tous-les-objects-stockés-procédures-triggersurs-tables-vues-contraintes-et-tous-autres-objects-bases de données /
Les autres réponses fonctionnent bien si vous voulez une copy complète, mais voici une autre approche que vous pourriez être insortinggué par. Si vous utilisez LINQ to SQL, vous pouvez créer un file DBML, puis utiliser la méthode CreateDatabase () dans votre context de données. Il ne copy pas le schéma entier (omet certaines contraintes, UDF, Procs, etc …) mais est utile dans les scénarios où vous voudrez opérer sur des tables et peut-être partitionner vos tests de database.
Voici quelques étapes:
Créer une application Windows Forms
Créer un file DBML (classs LINQ to SQL) appelé Foo
Faites glisser les tables / objects qui vous intéressent sur la surface de design
Fermer / Enregistrer
Quelque place dans votre application, vous pouvez écrire du code comme:
FooDataContext fooData = new FooDataContext (@ "string de connection à la nouvelle database");
fooData.CreateDatabase ();
Voici la documentation pour la méthode que j'ai décrite ci-dessus.
Malheureusement, le process le plus automatique que nous avons trouvé était en fait en utilisant un de ces outils de contrôle de la souris pour utiliser réellement SSMS pour copyr la database. Je ferais BEAUCOUP plutôt faire autre chose, mais aucune des réponses ne correspond vraiment à nos exigences.
Il est possible de faire ce que vous requestz par programme. Ce sont les étapes:
exec sp_msforeachtable 'truncate table ?'
Cela crée une database schématiquement identique de votre database "source" nommée "source_test". Tous les triggersurs, contraintes, procédures stockées, counts SQL Server et tous les autres bits de données qui ne sont pas le contenu de la table de données ou les numéros de séquence sont conservés. Tous les numéros de séquence seront réinitialisés à la valeur par défaut lorsque leurs tables sont tronquées.
Nous utilisons ces 5 étapes pour cloner nos propres bases de données SQL Server à des fins de test et autres. Cela fonctionne sur SQL Server 2000 vers l'avant.
Pour sauvegarder la database, vous exécutez l'instruction SQL sous la forme suivante:
"Backup database " + kstrDbName + " to disk = '" + strFullyPathedBackupFile + "' With Init";
"Init" est une option key qui indique à SQL Server d'écraser le file spécifié s'il existe. Plus d'informations peuvent être trouvées en consultant la documentation de SQL Server pour "database de sauvegarde".
Sur SQL Server 2005 et les versions ultérieures, vous pouvez utiliser le SMO pour restaurer la database et spécifier le nouveau nom de la database, ainsi que renommer les files de database (le file mdf et le file journal). Vous findez un exemple de code pour ce faire dans la documentation SMO de Microsoft SQL Server sur la fonctionnalité de restauration.
Sur SQL Server 2000, il n'y a pas de prise en charge SMO, il doit donc être effectué manuellement, via des instructions SQL exécutées. Cela prend l'instruction de forme semblable à:
ssortingng strSQL = "Restore database " + strDatabaseName + "from disk = '" + strSourcePathFile + "' with replace, " + " Move '" + strDatabaseName + "_Data' to '" + strDestinationPathFile + ".MDF', " + " Move '" + strDatabaseName + "_Log' to '" + strDestinationPathFile + ".LOG' "
Ensuite, vous utilisez une instruction Alter pour renommer les files MDF et LOG réels pour correspondre au nouveau nom. Oui, cela signifie que sur SQL Server 2000, vous ne pouvez pas avoir la database source et la database de destination. Pardon. Il pourrait être possible de renommer le file MDF et LOG en même time que la restauration, mais si c'est le cas, mon équipe ne pourrait pas le faire fonctionner. Nous sums passés à de nouvelles bases de données SQL Server, mais je pensais que l'ancien code serait complet pour cette réponse.
La déclaration alter est sous la forme de:
ssortingng AlterDbSQL = " Alter database " + strDatabaseName + " MODIFY FILE(NAME = " + Path.GetFileNameWithoutExtension( strDestinationPathFile ) + "_DATA, NEWNAME = " + strDatabaseName + "_Data) " + " Alter database " + strDatabaseName + " MODIFY FILE(NAME = " + Path.GetFileNameWithoutExtension( strDestinationPathFile ) + "_LOG, NEWNAME = " + strDatabaseName + "_LOG) "
Quelques notes: si tout ce qui vous intéresse est de créer une database de test, vous n'avez pas besoin d'effectuer l'étape 2 (se connecter à la source) et l'étape 3 (créer une sauvegarde) à chaque fois. Créez simplement une sauvegarde "model" de votre database actuelle contre laquelle vous souhaitez effectuer un test en créant une sauvegarde, en la restaurant, puis en tronquant les tables. Retournez cette database. Vous avez maintenant la sauvegarde d'une version purgée du contenu de données de votre database. Ce sera une plus petite sauvegarde, donc il sera plus rapide à copyr et plus rapide à restaurer. Tout ce que vous devez faire est d'append vos données de test et il est prêt pour les tests.