Как скопировать схему и некоторые данные из SQL Server в другой экземпляр? - PullRequest
4 голосов
/ 30 августа 2011

Мой продукт использует базу данных SQL Server - у каждого клиента есть собственный развернутый экземпляр в собственной интрасети.В БД около 200 таблиц.Большинство из них являются таблицами конфигурации, которые имеют только несколько строк, но есть несколько таблиц данных транзакций, которые могут иметь несколько миллионов строк.Часто мне нужно устранять проблему с конфигурацией клиента, поэтому мне нужна копия его базы данных для локальной работы в моей системе dev ... Однако она может быть очень большой из-за данных транзакции, что делает отправку очень сложной для клиентамне бэкап для работы.Мне нужен способ резервного копирования / копирования / экспорта всего, КРОМЕ для больших таблиц.

В идеале, большие таблицы действительно принадлежат отдельному каталогу базы данных, так что клиент может создавать резервные копии своих «данных» отдельно от своей «конфигурации».».Тем не менее, у меня нет полномочий вносить такие изменения, поэтому я ищу хороший способ экспортировать или копировать только части конфигурации без необходимости копировать все это.

В настоящее время у меня естьбыстрое и грязное приложение .NET, которое использует адаптер SQL и DataSet для слепого выбора * из всех таблиц, кроме тех, которые я хочу опустить, выгрузите их в файл XML (это функция экспорта моего бедняка).И у меня есть приложение-компаньон, которое я могу использовать локально, чтобы загрузить XML обратно в DataSet, а затем использовать SQLBulkCopy, чтобы загрузить его в мою базу данных разработчика.Мне пришлось сделать несколько трюков, чтобы отключить ограничения и так далее, но я заставил это работать.Это дает мне данные, но не схему .... в идеале я хотел бы получить способ получить схему вместе с ней.Это подход грубой силы, и я считаю, что должен быть более простой путь.Любые предложения по лучшему подходу?

Решение должно быть автоматизировано, поскольку я имею дело с конечными пользователями, которые, как правило, имеют очень небольшую ИТ-поддержку.

(SQL 2005 и выше)

Ответы [ 4 ]

13 голосов
/ 30 августа 2011

Не могли бы вы сгенерировать сценарии непосредственно из SSMS?

  1. Щелкните правой кнопкой мыши базу данных
  2. Выберите Задачи -> Создать сценарии
  3. (Нажмите «Далее», если вы получилиначальный экран)
  4. Выберите «Выбрать конкретные объекты базы данных»
  5. Выберите объекты, для которых создаются сценарии (таблицы, хранимые процедуры и т. д.)
  6. Нажмите Далее, затемукажите выходное имя файла
  7. Нажмите кнопку Готово, чтобы сгенерировать сценарий

Это сгенерирует только схемы.Если вы хотите также выполнить сценарии создания данных, на шаге 6) нажмите кнопку «Дополнительно» и прокрутите вниз до «Типы данных для сценария» и измените его с «Только схема» на «Только данные» или «Схема и данные»

В вашей ситуации вы можете выполнить «Схема и данные» для всех ваших маленьких таблиц конфигурации, а затем «Только схема» для больших таблиц, в которые вы не хотите экспортировать данные.

Я знаю, что это не полностью автоматизировано, но довольно близко.Если вы хотите еще больше автоматизировать процесс, ознакомьтесь с этой веткой.Не уверен, что это работает в SQL 2005:

Как автоматизировать задачу «генерации сценариев» в SQL Server Management Studio 2008?

11 голосов
/ 15 августа 2013

Всего пара комментариев, поскольку в прошлом у нас была похожая проблема.

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

Для больших баз данных единственное жизнеспособное решение - это то, что вы создали сами или используете сторонние инструменты.

В итоге мы использовали сторонний инструмент .SQL Packager работал немного лучше в то время, когда мы оценивали, но нам удалось получить другой инструмент в основном бесплатно…

В любом случае, надеюсь, что это поможет, хотя это поздний ответ / комментарий…

2 голосов
/ 15 сентября 2011

Я решил это следующим образом.Я создал собственное приложение winform для экспорта своих данных:

  1. используйте SMO (класс переноса), чтобы записать всю схему в файл .sql
  2. цикл через все указанные таблицы (на самом деле япросто перечислил большие растущие, которые нужно игнорировать, и обработайте все остальное) используя: select * from
  3. захватить записи в объекты DataTable и выгрузить их в файлы .xml
  4. Сжать всю папку вверхчтобы быть отправленным обратно ко мне

И у меня есть собственное приложение winform, которое я использую локально в моей системе dev для импорта данных:

  1. Создание пустой базы данных
  2. Запустите файл .sql для построения схемы.
  3. Отключите все ограничения для всех таблиц (используя sp_foreachtable)
  4. переберите все файлы .xml и выполните массовый импорт их с помощью объекта SqlBulkCopy
  5. Повторно включить все ограничения (используя sp_foreachtable)

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

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

К вашему сведению, у меня почти получилось работать с sqlpubwiz, но возможностьДанные скрипта - это все или ничего ... Вы не можете игнорировать определенные таблицы ... это было нарушением условий для моего приложения.Объект Transfer в SMO - очень полезный класс, для создания сценария всей схемы базы данных требуется всего несколько строк кода, включая все зависимости в правильном порядке создания, чтобы воссоздать базу данных с нуля!

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.transfer.aspx

0 голосов
/ 05 сентября 2011

Здесь, в Red Gate, у нас есть инструмент под названием SQL Packager с командной строкой, которую можно автоматизировать для выполнения этой задачи. При этом используются механизмы сравнения SQL и SQL Data Compare. Мне было бы интересно получить ваши отзывы о том, удовлетворяет ли это вашему варианту использования.

http://www.red -gate.com / продукты / SQL-разработка / SQL-упаковщик /

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