SQL Server, выполнить пакетный скрипт T-SQL для нескольких баз данных - PullRequest
4 голосов
/ 22 сентября 2009

В нашем экземпляре SQL Server 2000 размещено несколько одинаковых баз данных, по одной для каждого нашего клиента. Когда приходит время обновить их все, мы используем Red Gate SQL Compare для генерации сценария миграции между базой данных разработки и копией базы данных текущего состояния всех баз данных клиентов.

SQL Compare генерирует скрипт, который является транзакционным, если один шаг завершится неудачно, скрипт откатит все назад. Но в настоящее время наша система использует метод, который разделяет скрипт на разделители пакетов (оператор GO ), а затем запускает каждую команду отдельно, что разрушает весь транзакционный материал. Оператор GO не поддерживается при запросе базы данных с помощью программирования (в классическом ASP)

Я хочу знать, как я могу запустить этот скрипт (сохраняя транзакции) во всех этих базах данных (например, 250 БД) программно или вручную с помощью инструмента? В Query Analyzer нам нужно выбрать каждую БД и нажать Выполнить , что довольно много для количества БД, которое у нас есть.

Ответы [ 5 ]

6 голосов
/ 22 сентября 2009

Если вы можете использовать SSMS из SQL 2005 или 2008, я бы порекомендовал бесплатный SSMS Tool Pack

3 голосов
/ 22 сентября 2009

Я использую внешний sqlcmd инструмент командной строки . У меня такая же ситуация на сервере я работаю.

У меня есть скрипт в файле * .sql и список баз данных на втором файле. У меня есть небольшой * .bat скрипт, который перебирает все базы данных и выполняет скрипт с помощью команды sqlcmd .

Более подробно у меня так:

  • Файл DB.ini со всеми базами данных, в которых я хочу развернуть свой сценарий
  • sql / каталог, где я храню все скрипты
  • runIt.bat - скрипт, который развертывает скрипты

Командная строка выглядит примерно так:

sqlcmd -S <ComputerName>\<InstanceName> -i <MyScript.sql> -d <database_name> -T

В SQL Server 2000 это была утилита osql

UPDATE

Red Gate теперь имеет инструмент под названием SQL Multi Script , который в основном делает именно то, что вам нужно. Я поддерживаю SQL 2000 до 2008 R2 и параллельно выполняю запросы к нескольким базам данных, что повышает производительность.

1 голос
/ 12 октября 2016

7 лет спустя у меня была такая же проблема столько раз, что я сделал ее и опубликовал проект:

ТАКОДЕПЛОЙ

Вот некоторые особенности:

  • Получить все базы данных из одного экземпляра и применить фильтр имен. Или только одно прямое соединение.
  • Смешивайте источники базы данных столько, сколько хотите. Например, два прямых и один полный экземпляр с или без фильтра.
  • Редактор скриптов (Avalon Text, тот же монодизайн)
  • Сценарии анализируются и ошибки обнаруживаются перед выполнением.
  • Скрипты «разбиты» по операторам GO.
  • Сохранить развертывание в файл
  • Получите список всех баз данных перед развертыванием.
  • Смотрите в режиме реального времени, что происходит (здесь рекомендуются операторы PRINT!).
  • Автоматический откат к независимой базе данных в случае возникновения ошибки.
  • Прозрачные обновления через белку.

Вы можете получить его по адресу: https://github.com/andreujuanc/TakoDeploy

0 голосов
/ 22 сентября 2009

Если я вспомню, вы также можете создать скрипт в SQL Compare, чтобы вернуть все обратно в состояние, в котором он был запущен. Возможно, вы захотите сгенерировать и то, и другое.

Когда я делал такое развертывание (это было некоторое время), я сначала загружал на промежуточный сервер, который был сделан точно так же, как prod, прежде чем я начал проверять, что сценарии будут работать на prod. Если что-то не удалось (обычно из-за порядка запуска сценариев, например, нельзя установить внешний ключ для таблицы, которая еще не существует). Я также сначала записал все изменения таблицы, затем все изменения представлений, затем все изменения UDF, а затем все сохраненные изменения процедур. Это значительно сократило количество сбоев из-за объектов, которые еще не существовали, но у меня все еще было несколько вещей, которые нужно было отрегулировать.

0 голосов
/ 22 сентября 2009

Не уверен, что это сработает, но попробуйте заменить операторы GO точками с запятой и запустить весь оператор в одном пакете.

...