Скрипт создания базы данных - внешние параметры / настройки - PullRequest
0 голосов
/ 04 января 2010

Сводка вопроса:

Есть ли лучший способ, чем приведенный ниже, для реализации этапа автоматического создания базы данных при создании базы данных?

Фон / Требования:

  • Я пытаюсь разработать целостный процесс управления версиями базы данных, используя подход, аналогичный этому . Этот вопрос конкретно касается baseline , который включает физическое создание базы данных.

  • На данный момент планируется реализовать простой инструмент командной строки (в .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 (или, по крайней мере, таким же «действительным», каким он является в настоящее время), но все еще сломал бы инструмент развертывания. Отсутствие побега, с одной стороны, вызывает беспокойство. А параметры шаблона внутри буквенных строк заставляют мою кожу ползать.

Другие возможности, которые я рассмотрел:

  • Создание динамического сценария SQL для выполнения с sp_executesql. Это обеспечило бы преимущество истинных параметров по сравнению с наивным шаблоном, но сделало бы сценарий невероятно громоздким при написании, тестировании и обслуживании, особенно если мы когда-нибудь решим взять новую базовую линию (которую мы могли бы - это большая база данных) .

  • Использовать параметры шаблона SSMS. Это прекрасно отделяет его от инструмента развертывания, но также затрудняет интеграцию с инструментом развертывания - своего рода связывает его с SSMS.

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

  • Генерирует весь сценарий динамически из внешнего, удобочитаемого человеком файла, такого как YAML. Сначала эта идея казалась очень изящной, но в конце концов она начала тонуть в том, что я мог заново изобретать колесо. Все о базе данных должно быть включено в файл, поэтому действительно ли это дает какое-то преимущество по сравнению с ручным изменением обычного сценария SQL или даже созданием базы данных вручную через SSMS?

Ни один из этих вариантов не кажется совершенно правильным. То, что мне нужно, это то, что не зависит (точно так же, как код теоретически не зависит от среды, которую вы используете для его создания), но также читаем (без «SQL в SQL») и не требует пояснений (четко определяет, какие настройки необходимы и какие могут быть хорошие значения по умолчанию).

Существуют ли методы, которые позволят достичь всего, чего я пытаюсь достичь? Или я просто слишком разборчив или неправильно смотрю на проблему?

(P.S. Я не в настоящее время ищу коммерческие, автономные, сторонние инструменты, которые будут выполнять эту задачу для меня. "Теперь у меня две проблемы.")

Ответы [ 3 ]

1 голос
/ 04 января 2010

Рассматривали ли вы использование SQLCMD сценариев и SQLCMD утилита вместо написания собственного интерфейса командной строки или, возможно, написания своего собственного и простого переноса функций SQLCMD? Естественно, это предполагает, что вы хотите поддерживать только SQL 2005 и выше. В прошлом я делал это несколькими различными способами (например, используя просто командный файл с параметрами / параметрами, которые обертывают SQLCMD, используя более обширный подход, обернутый кодом, который, к сожалению, в то время оказался VB 6.0, и т. Д.) ,

Если вы пойдете по пути обертывания со своим собственным кодом, возможно, вы захотите также использовать PowerShell (в настоящее время я тоже думаю об этом). Sql Server теперь включает в себя пользовательских провайдеров и расширений Powershell для таких вещей, как функциональность SMO, выполнение кода, управление и т. Д., Которые можно легко и просто расширить, чтобы обернуть функции SQLCMD и SQL.

Учитывая то, что вы пытаетесь сделать, преимущества SQLCMD (и сценариев SQLCMD), кажется, хорошо вписываются в вещи:

  • Сценарии по-прежнему действительны для использования / интерпретации / интеграции с SSMS и другими IDE
  • Существует несколько вариантов значений по умолчанию, хотя в сами сценарии ничего не интегрировано (переменные среды, параметры командной строки и т. Д.). Кроме того, вы можете рассмотреть возможность получения значений по умолчанию для расположений файлов / групп из заранее определенного расположения на сервере / экземпляре, на котором вы работаете (например, модель, мастер или база данных tempdb).
  • Менее неубедительно в том смысле, что текущие IDE, поддерживающие SQLCMD, будут генерировать исключения в режиме SQLCMD для неопределенных комбинаций переменных / значений

Если вы хотите обменяться заметками / мыслями о вашем проекте, я определенно буду рад помочь с кодированием и / или просто поговорить о некоторых проблемах, с которыми я столкнулся (различные версии движка, например, и использование функций). было несколько вещей, о которых я изначально не думал).

1 голос
/ 04 января 2010

Мы решили аналогичную проблему, создав скрипт, который мог бы использовать параметры sqlcmd. Что-то вроде:

:setvar filename somefile.ext
:setvar version 1
:on error exit

print 'This is version $(version) on $(filename)'
-- the rest of the actual script

Это можно запустить через командную строку или в SSMS. В конце концов мы создали инструмент, который мог читать файл и заменять переменные с одинаковым синтаксисом.

Не думаю, что это решает все проблемы, которые вы перечислили, но с некоторыми должно помочь.

1 голос
/ 04 января 2010

Вероятно, я бы использовал этот скрипт как встроенный шаблон в инструменте командной строки; получите минимальную информацию, которая вам необходима (для замены заполнителей - DBName и LogFileSize; другие вещи, такие как имена файловых групп, могут быть выведены из DBName, например, FG_ {DBName} _PRIMARY для основной файловой группы) из параметров командной строки. Используйте текстовый поиск / замену, чтобы заполнить пробелы, а затем выполните это для SQL Server, на котором вы хотите его развернуть.

например. что-то вроде:

CreateDB -server:(local) -dbname:MyTestDB -logsize:50 (as in 50 MB)

Или: использовать SMO (объекты управления SQL Server) для создания базы данных. В основном вам нужна та же информация (имя базы данных, размер файла журнала), и вы можете программно создать базу данных и ее макет - сценарий T-SQL не требуется.

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

  • основная файловая группа : оставлено в покое только для представлений системного каталога - ничего больше
  • Файловая группа DATA : пометить как DEFAULT, использовать для таблиц
  • Файловая группа INDEX : для индексов

Таким образом, вы минимизируете размер основной файловой группы и, таким образом, минимизируете риск ее возникновения в результате ошибки диска и повреждения. Основная файловая группа содержит системные каталоги, поэтому, если эта FG разрушена, вся ваша БД будет тостовой.

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