SQL Server, выполнить пакетный скрипт T-SQL для нескольких баз данных
Наш экземпляр SQL Server 2000 содержит несколько одинаковых баз данных, по одной для каждого нашего клиента. Когда приходит время обновить их все, мы используем Red Gate SQL Compare для генерации сценария миграции между базой данных разработки и копией базы данных текущего состояния всех баз данных клиентов.
SQL Compare генерирует сценарий, который является транзакционным, если один шаг завершается неудачно, сценарий откатывает все назад. Но в настоящее время наша система использует метод, который разделяет скрипт на разделители пакетов (оператор GO), а затем запускает каждую команду отдельно, что разрушает весь транзакционный материал. Оператор GO не поддерживается при запросе базы данных с помощью программирования (в классическом ASP)
Я хочу знать, как я мог запустить этот скрипт (сохраняя транзакции) во всех этих базах данных (например, 250 БД), программно или вручную в инструменте? В Query Analyzer нам нужно выбрать каждую БД и нажать кнопку " Выполнить", что достаточно для того количества БД, которое у нас есть.
5 ответов
Я использую внешний инструмент командной строки sqlcmd. У меня такая же ситуация на сервере я работаю.
У меня есть скрипт в *.sql файле и список баз данных на 2й файл. У меня есть небольшой *.bat скрипт, который перебирает все базы данных и выполняет скрипт с помощью команды sqlcmd.
Более подробно у меня так:
- Файл DB.ini со всеми базами данных, на которых я хочу развернуть свой скрипт
- sql/ каталог, где я храню все скрипты
- runIt.bat - скрипт, который развертывает скрипты
Командная строка выглядит примерно так:
sqlcmd -S <ComputerName>\<InstanceName> -i <MyScript.sql> -d <database_name> -T
В SQL Server 2000 это была утилита osql
ОБНОВИТЬ
Red Gate теперь имеет инструмент под названием SQL Multi Script, который в основном делает именно то, что вы хотите. Я поддерживаю SQL 2000 до 2008 R2 и параллельно выполняю запросы к нескольким базам данных, что повышает производительность.
Если вы можете использовать SSMS из SQL 2005 или 2008, то я бы порекомендовал бесплатный пакет инструментов SSMS
7 лет спустя у меня была такая же проблема много раз, поэтому я сделал это и опубликовал проект:
TAKODEPLOY
Вот некоторые особенности:
- Получить все базы данных из одного экземпляра и применить фильтр имен. Или только одно прямое соединение.
- Смешивайте источники базы данных столько, сколько хотите. Например, два прямых и один полный экземпляр с или без фильтра.
- Редактор скриптов (Avalon Text, тот же монодизайн использует)
- Сценарии анализируются и ошибки обнаруживаются перед выполнением.
- Скрипты "разбиты" по операторам GO.
- Сохраните ваше развертывание в файл
- Получите список всех баз данных перед развертыванием.
- Смотрите в режиме реального времени, что происходит (операторы PRINT рекомендуются здесь!).
- Автоматический откат к независимой базе данных в случае возникновения ошибки.
- Прозрачные Обновления через Белку.
Вы можете получить его по адресу: https://github.com/andreujuanc/TakoDeploy
Не уверен, что это сработает, но попробуйте заменить операторы GO точками с запятой и запустить весь оператор в одном пакете.
Насколько я помню, вы также можете создать скрипт в SQL Compare, чтобы вернуть все обратно в состояние, в котором он был запущен. Возможно, вы захотите сгенерировать и то, и другое.
Когда я делал такое развертывание (это было некоторое время), я сначала загружался на промежуточный сервер, который был сделан точно так же, как prod, прежде чем я начал проверять, что сценарии будут работать на prod. Если что-то не удалось (обычно из-за порядка выполнения сценариев, например, нельзя установить внешний ключ для таблицы, которая еще не существует). Я также сначала записал все изменения таблицы, затем все изменения представлений, затем все изменения UDF, а затем все сохраненные изменения процедур. Это значительно сократило количество сбоев из-за объектов, которые еще не существовали, но у меня все еще было несколько вещей, которые нужно было отрегулировать.