Как программно клонировать схему базы данных в SQL Server? - PullRequest
2 голосов
/ 12 февраля 2009

Я бы хотел провести тщательное тестирование своего проекта, и я хотел бы запустить программу командной строки, которая будет копировать только структуру базы данных, а не реальные данные. Затем я могу запустить свои тесты в этой новой базе данных.

Идеи

Обновление: кто-то сказал, что я должен указать язык. Я думал, что TSQL таким образом, если Sql Server работает, скрипт должен работать. Кроме того, это SQL Server 2005.

Ответы [ 5 ]

3 голосов
/ 12 февраля 2009

Вы не скажете, какую версию SQL Server вы используете, если посмотреть на 2005 год на DMO - Database Management Objects, набором библиотек COM, которые предоставляют вам доступ к функциям, найденным в Enterprise Manager / Management Studio. 1001 *

В 2008 году у нас была аналогичная функциональность SMO, но, как и у сборок .Net, у MS есть несколько хороших примеров кода . Их пример скриптинга выглядит так, как вам нужно: -

снял со своего сайта у нас

//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 StringCollection 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) { 
         StringCollection sc = default(StringCollection); 
         sc = scrp.Script(smoObjects); 
         string st = null; 
         foreach ( st in sc) { 
            Console.WriteLine(st); 
         } 
      } 
   } 
} 
0 голосов
/ 17 октября 2014

Можно делать то, что вы просите программно. Это шаги:

  1. Проверьте, существует ли ваша база данных "source_test", и если да, удалите ее.
  2. Подключение к вашей исходной базе данных,
  3. Создать резервную копию исходной базы данных
  4. Восстановление исходной базы данных в базу данных «source_test» при переименовании файлов фактической базы данных
  5. Выполнить хранимую процедуру утилиты SQL Server, exec sp_msforeachtable 'truncate table ?'

Это создает схематически идентичную базу данных вашей «исходной» базы данных с именем «source_test». Все триггеры, ограничения, хранимые процедуры, учетные записи SQL Server и все остальные биты данных, которые не являются содержимым таблицы данных или порядковыми номерами, сохраняются. Все порядковые номера будут сброшены к значению по умолчанию, когда их таблицы будут обрезаны.

Мы используем эти 5 шагов для клонирования наших собственных баз данных SQL Server для тестирования и других целей. Это работает на SQL Server 2000 вперед.

Для резервного копирования базы данных вы выполняете оператор SQL в виде:

"Backup database " + kstrDbName + " to disk = '" + strFullyPathedBackupFile + "' With Init";

«With Init» - это ключевой параметр, который указывает SQL Server перезаписывать указанный файл, если он существует. Дополнительную информацию можно найти, просмотрев документацию по SQL Server для «Резервная копия базы данных».

В SQL Server 2005 и новее вы можете использовать SMO для восстановления базы данных и указать новое имя базы данных, а также переименовать файлы базы данных (mdf и файл журнала). Пример кода того, как это сделать, можно найти в документации SMO ​​Microsoft SQL Server о функции восстановления.

В SQL Server 2000 поддержка SMO отсутствует, поэтому это необходимо сделать вручную с помощью выполненных операторов SQL. Это принимает форму заявления, похожую на:

    string strSQL = "Restore database " + strDatabaseName + "from disk = '" + strSourcePathFile + "' with replace, " +
            " Move '" + strDatabaseName + "_Data' to '" + strDestinationPathFile + ".MDF', " +
            " Move '" + strDatabaseName + "_Log' to '" + strDestinationPathFile + ".LOG' " 

Затем вы используете оператор Alter, чтобы переименовать фактические файлы MDF и LOG, чтобы они соответствовали новому имени. Да, это означает, что в SQL Server 2000 у вас не может быть исходной базы данных и целевой базы данных. Сожалею. Возможно, можно будет сделать переименование файла MDF и LOG одновременно с восстановлением, но если это так, моя команда не сможет заставить его работать. Мы перешли к новым базам данных SQL Server, но я подумал, что для полноты ответа на этот вопрос я потяну старый код.

Оператор alter имеет вид:

    string 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) "

Некоторые примечания: если все, что вас интересует, это создание тестовой базы данных, то вам не нужно каждый раз выполнять шаг 2 (подключение к источнику) и шаг 3 (создание резервной копии). Просто создайте «шаблонную» резервную копию вашей текущей базы данных, с которой вы хотите протестировать, создав резервную копию, восстановив ее, а затем обрезав таблицы. Резервное копирование этой базы данных. Теперь у вас есть резервная копия очищенной версии базы данных. Это будет меньшая резервная копия, поэтому она будет быстрее копировать и быстрее восстанавливать. Все, что вам нужно сделать, это добавить данные теста, и он готов к тестированию.

0 голосов
/ 14 мая 2010

К сожалению, самым автоматическим процессом, который мы обнаружили, было использование одного из этих инструментов управления мышью для фактического использования SSMS для копирования базы данных. Я бы предпочел сделать что-то еще, но ни один из ответов на самом деле не соответствует нашим требованиям.

0 голосов
/ 12 февраля 2009

Другие ответы работают хорошо, если вам нужна полная копия, но здесь есть другой подход, которым вы можете быть заинтригованы. Если вы используете LINQ to SQL, вы можете создать файл DBML и затем использовать метод CreateDatabase () в вашем контексте данных. Он не копирует всю схему (пропускает некоторые ограничения, UDF, Procs и т. Д.), Но полезен в сценариях, где вы можете работать с таблицами и, возможно, разбить тестирование вашей базы данных.

Вот несколько шагов:

  1. Создание приложения Windows Forms

  2. Создание файла DBML (классы LINQ to SQL) с именем Foo

  3. Перетаскивание интересующих вас таблиц / объектов на поверхность дизайна

  4. Закрыть / Сохранить

  5. В каком-то месте вашего приложения вы можете написать код:

    FooDataContext fooData = new FooDataContext (@ "строка подключения к новой базе данных");

    fooData.CreateDatabase ();

Здесь - документация для метода, который я описал выше.

0 голосов
/ 12 февраля 2009

вы можете использовать следующий подход http://fahadaz.blogspot.com/2008/10/database-scripts-and-contiguous.html но это потребовало от вашей базы данных создания сценариев.

Если у вас их нет, вы можете использовать следующую статью для их создания http://blog.sqlauthority.com/2007/08/21/sql-server-2005-create-script-to-copy-database-schema-and-all-the-objects-stored-procedure-functions-triggers-tables-views-constraints-and-all-other-database-objects/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...