Вопроса Резюме:сценарий - внешние параметры/настройки
Есть ли лучший способ, чем тот, публикуемый ниже осуществить этап базы данных создания автоматизированного развертывания?
Предпосылки/Требования:
Я нахожусь в процессе попытки разработать согласованный процесс управления версиями базы данных, используя подход, аналогичный this one. Этот вопрос конкретно касается базовой линии , которая включает физическое создание базы данных.
План - на данный момент - это реализовать простой инструмент командной строки (в .NET) для применения сценариев базовой линии и изменения. Я хочу, чтобы инструмент был общим (у нас есть несколько независимых транзакционных баз данных), и поэтому хотелось бы, чтобы все сценарии были внешними, включая создание базы данных.
Испытательная среда (и) не может быть идеальной копией продукции; физические местоположения и размеры файлов могут быть совершенно разными.
Текущая идея: (То, что я ищу обратную связь на)
В основном система шаблонов. Используйте простой string.Replace
на сценарий вроде следующего:
CREATE DATABASE [{DBNAME}] ON PRIMARY
(
NAME = N'MyDB_Data',
FILENAME = N'{PRIMARYFILENAME}',
SIZE = {PRIMARYSIZE}KB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 5%
),
FILEGROUP [FG_MyDB_Index]
(
NAME = N'MyDB_Index',
FILENAME = N'{INDEXFILENAME}',
SIZE = {INDEXSIZE}KB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 5%
),
-- more filegroups ...
LOG ON
(
NAME = N'MyDB_Log',
FILENAME = N'{LOGFILENAME}',
SIZE = {LOGSIZE}KB,
-- etc.
)
GO
ALTER DATABASE [{DBNAME}] SET COMPATIBILITY_LEVEL = 100
GO
-- more ALTER DATABASE stuff ...
Очевидно, что жетоны будут заменены те, как {DBNAME}
и {LOGFILESIZE}
. Значения для них будут взяты из параметров командной строки или, возможно, из внешнего файла.
Проблемы я вижу с этим подходом:
"сценарий" позиционирует себя как сценарий T-SQL, но это на самом деле недействительных T-SQL. Это заставляет вас либо использовать инструмент развертывания, либо выполнять утомительный ручной поиск и замену.
Невозможно запустить его со значениями по умолчанию. Хуже того, это не указывает на то, что будет хорошим значением по умолчанию.
Это чувствует себя неубедительно. Похоже, что можно было бы изменить сценарий таким образом, чтобы он по-прежнему был действительным SQL (или, по крайней мере, как «действительный», как он есть на данный момент), но все же нарушает инструмент развертывания. Отсутствие каких-либо побегов, например, касается. И параметры шаблона в литеральных строках заставляют меня сканировать скин.
Другие возможности, которые я Рассмотренные:
Construct динамический SQL сценарий, который будет выполняться с
sp_executesql
.Это обеспечило бы использование истинных параметров в отличие от наивного шаблона, но сделало бы сценарий невероятно громоздким для написания, тестирования и поддержки, особенно если мы когда-либо решаем взять новую базовую линию (что мы могли бы - это большая база данных) ,Используйте параметры шаблонов SSMS. Это отлично отделяет его от инструмента развертывания, но также затрудняет интеграцию с инструментом развертывания - как-то связать его с SSMS.
Внедрение сценария в инструмент развертывания. Таким образом, никто не может обходиться с ним, и ясно, что сценарий - это просто шаблон, который нужно обработать. Значения по умолчанию могут быть внедрены где-то «близко» к скрипту. Основным, огромным недостатком является то, что инструмент развертывания становится специфичным для приложения и может потребовать изменения кода для чего-то, что действительно не требует изменения кода.
Сгенерировать весь сценарий динамически с внешнего, доступного для человека файла, такого как YAML. Сначала эта идея показалась очень элегантной, но в конце концов она начала погружаться в то, что я мог бы изобретать колесо. Все, что нужно сделать в базе данных, должно быть включено в базу данных, так ли это действительно дает какое-либо преимущество перед изменением вручную простого сценария SQL или даже создания базы данных вручную через SSMS?
Ни один из этих вариантов не кажется совершенно правильным. То, что я хочу, это то, что независимое (так же, как код теоретически не зависит от среды, которую вы используете для его создания), но также и читаемый (нет «SQL внутри SQL») и самоочевидный (четко определяет, что необходимы настройки и какие могут быть хорошие значения по умолчанию).
Есть ли какие-либо методы, которые достигнут всего, чего я пытаюсь достичь? Или я просто слишком разборчива или неправильно смотрю на проблему?
(PS Я не в настоящее время ищет коммерческого, автономный, 3-сторонних разработчиков, которые будут выполнять эту задачу для меня. «Теперь у меня есть две проблемы.»)
Я думаю, что это на самом деле то, что я искал. Из того, что я прочитал, SMO не будет принимать сценарий, подобный этому напрямую, но синтаксис для ': setvar' прост и до тех пор, пока я не пытаюсь поддерживать какие-либо другие команды, должно быть возможно преобразовать скрипт в коде. – Aaronaught