Как компания по разработке программного обеспечения, у вас может быть несколько экземпляров баз данных для различных сред, таких как разработка, QA, стейджинг и продакшн. В ходе жизненного цикла разработки разработчики часто вносят изменения в данные в базе данных разработки, которые затем необходимо продвигать в другие среды для тестирования и проверки.
Однако бывают случаи, когда исходный скрипт для данных отсутствует или обновления были сделаны напрямую в базе данных без обновления скрипта. В таких случаях становится необходимым автоматизировать процесс экспорта этих записей и генерации скриптов для развертывания.
В этой статье мы рассмотрим простой скрипт, который можно использовать для упрощения создания скриптов для записей, которые необходимо импортировать в другие базы данных с использованием объектной модели SQL-DMO (Distributed Management Objects) с помощью VBScript.
Решение и использование
Решение представляет собой VBScript, который выполняет SQL-запрос в целевой базе данных. Он выполняет следующие задачи:
- Входит в систему на целевом сервере/базе данных с использованием аутентификации Windows (может быть улучшено для использования SQL-логинов)
- Выполняет запрос для получения нужных записей (например, на основе определенного идентификатора или записей, созданных после определенной даты)
- Определяет целевую таблицу на основе запроса
- Определяет, какие поля должны быть экспортированы (с некоторыми исключениями, такими как идентификаторы, временные метки и вычисляемые поля)
- Создает оператор вставки или обновления для каждой записи
- Записывает скрипты в текстовый файл
Скрипт может быть выполнен из пакетного файла с использованием следующего синтаксиса:
WBScript 0g_exportRecord [servername] [database] [query] [filename] [command]
Например:
WBScript 0g_exportRecors devdb catalog "select * from setting where id in (102,103)" "c:\my files\setting.sql" 0
Поддерживаемые запросы
Скрипт поддерживает любое допустимое SQL-выражение без объединений. Идея заключается в том, чтобы создать скрипт данных из каждой отдельной таблицы и создать соответствующие операторы вставки/обновления для этой таблицы. Вот несколько примеров запросов, которые можно использовать:
Select * from [MY_TABLE] where id = 1 or id = 2 Select col1,col2,col3 from [MY_TABLE] where id in (1,2) Select * from [MY_TABLE] (NOLOCK) where col2 like ('text%') select * from [MY_TABLE] where created_date > '9/21/2009'
Скрипт состоит из главной функции и пяти вспомогательных функций. Главная функция проверяет аргументы, переданные скрипту, и подключается к базе данных с использованием объекта SQLDMO.Server. Затем он выполняет запрос и получает набор результатов с использованием объекта SQLDMO.QueryResults.
Скрипт определяет имя таблицы и столбцы, которые нужно игнорировать (например, идентификаторы, временные метки, вычисляемые поля) с использованием объекта SQLDMO.Database. Он создает оператор вставки/обновления, перебирая набор результатов и заменяя токены квадратных скобок фактическими значениями столбцов.
Наконец, скрипт записывает операторы в указанный файл, создавая новый файл или добавляя к существующему.
Заключение
Используя этот скрипт, вы можете автоматизировать процесс экспорта данных из одной базы данных SQL Server и генерации операторов вставки/обновления для развертывания в других средах. Это позволяет отслеживать изменения и включать их в процесс развертывания, исключая необходимость вручных обновлений или полагаясь на резервные копии SQL Server.
Ограничения и улучшения
В настоящее время скрипт не экспортирует идентификаторы, но эту функциональность можно добавить для оператора вставки. Кроме того, скрипт использует аутентификацию Windows и может быть улучшен для поддержки SQL-логинов. Его также можно дополнительно улучшить для чтения конфигурационного файла XML или SQL-таблицы для подключения к различным серверам/базам данных и выполнения нескольких запросов.